25.3 非线性规划

Octave 还可以使用序列二次规划求解器执行一般的非线性最小化。

 
[x, obj, info, iter, nf, lambda] = sqp (x0, phi)
[…] = sqp (x0, phi, g)
[…] = sqp (x0, phi, g, h)
[…] = sqp (x0, phi, g, h, lb, ub)
[…] = sqp (x0, phi, g, h, lb, ub, maxiter)
[…] = sqp (x0, phi, g, h, lb, ub, maxiter, tolerance)

使用序列二次规划 (SQP) 方法最小化目标函数。

求解如下非线性规划问题

min phi (x)
 x

满足约束条件

g(x)  = 0
h(x) >= 0
lb <= x <= ub

使用序列二次规划方法。

第一个参数是向量 x0 的初始猜测值。

第二个参数是指向目标函数 phi 的函数句柄。目标函数必须接受一个向量参数并返回一个标量。

第二个参数也可以是一个包含 2 个或 3 个函数句柄的元胞数组。第一个元素应指向目标函数,第二个元素应指向计算目标函数梯度的函数,第三个元素应指向计算目标函数 Hessian 矩阵的函数。如果未提供梯度函数,则通过有限差分法计算梯度。如果未提供 Hessian 矩阵函数,则使用 BFGS 更新公式来近似 Hessian 矩阵。

如果提供了梯度函数,则 phi{2} 必须接受一个向量参数并返回一个向量。如果提供了 Hessian 矩阵函数,则 phi{3} 必须接受一个向量参数并返回一个矩阵。

第三和第四个参数 gh 是函数句柄,分别指向计算等式约束和不等式约束的函数。如果问题没有等式(或不等式)约束,则对 g(或 h)使用空矩阵 ([])。如果提供了这些函数,则等式和不等式约束函数必须接受一个向量参数并返回一个向量。

第三和第四个参数也可以是包含 2 个函数句柄的元胞数组。第一个元素应指向约束函数,第二个元素应指向计算约束函数梯度的函数:

            [ d f(x)   d f(x)        d f(x) ]
transpose ( [ ------   -----   ...   ------ ] )
            [  dx_1     dx_2          dx_N  ]

第五和第六个参数 lbub 分别包含 x 的下界和上界,如果提供了这两个参数,则它们必须是和 x0 大小相同的向量。边界必须与等式和不等式约束 gh 一致。

第七个参数 maxiter 指定最大迭代次数。默认值为 100。

第八个参数 tolerance 指定终止条件的容差。默认值为 sqrt (eps)

info 的返回值可以是以下值之一:

101

算法正常终止。所有约束均满足指定的容差。

102

BFGS 更新失败。

103

已达到最大迭代次数。

104

步长变得过小,即 Δx 小于 tol * norm (x)

调用 sqp 的示例如下:

function r = g (x)
  r = [ sumsq(x)-10;
        x(2)*x(3)-5*x(4)*x(5);
        x(1)^3+x(2)^3+1 ];
endfunction

function obj = phi (x)
  obj = exp (prod (x)) - 0.5*(x(1)^3+x(2)^3+1)^2;
endfunction

x0 = [-1.8; 1.7; 1.9; -0.8; -0.8];

[x, obj, info, iter, nf, lambda] = sqp (x0, @phi, @g, [])

x =

  -1.71714
   1.59571
   1.82725
  -0.76364
  -0.76364

obj = 0.053950
info = 101
iter = 8
nf = 10
lambda =

  -0.0401627
   0.0379578
  -0.0052227

另请参阅: qp


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2