用Octave计算非线性规划问题(序列二次规划法)(1)
广告
{{v.name}}
非线性规划(NLP)就是目标函数或约束里出现了非线性项(平方、乘积、根号、指数、三角函数等),不能再用单纯形、内点法直接解,必须用迭代型数值算法。
核心解法
1. 无约束非线性规划
最速下降法(简单但慢)
牛顿法 / 拟牛顿法(BFGS 最常用)
共轭梯度法
2. 带约束非线性规划
罚函数法(外罚函数法 / 内罚函数法)
序列二次规划 SQP(目前最强)
内点法(大规模 NLP)
序列二次规划(SQP)例子:
\(
\min \quad x^2_1 × \sqrt{x_2} + e^{x_3} + \sin(x_4)
\)
\(
s.t. \quad
\begin{cases}
x_1 + 2x_2 = 0 \\
3x_3 + 4x_4 = 0 \\
\end{cases}
\)
设\(x_0=\begin{bmatrix}0 & 0 & 0 & 0\end{bmatrix}\),代码如下:
>> x0 = [0 0 0 0];
定义非线性函数 phi(x),代码如下:
>> function ret = phi (x)
ret = x(1)^2 * sqrt(x(2)) + exp(x(3)) + sin(x(4));
endfunction
定义约束函数 g(x),代码如下:
>> function ret = g (x)
ret = [x(1) + 2*x(2); 3*x(3) + 4*x(4)];
endfunction
求解,代码如下:
>> [x, obj, info, iter, nf, lambda] = sqp (x0, @phi, @g)
x =
1.6098e-15
-5.6899e-16
-3.1604e-01
2.3703e-01
obj = 9.6385e-01 + 6.1817e-38i
info = 104
iter = 7
nf = 71
lambda =
9.8472e-17
2.4301e-01