25.3 Nonlinear Programming

Last-modified: 2025-03-08 (土) 14:16:40

5.3 非線形計画法

Octave は、逐次二次計画法ソルバーを使用して一般的な非線形最小化を実行することもできます。

: sqp [x, obj, info, iter, nf, lambda] = (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) を使用して目的関数を最小化します。

非線形計画法を解く

最小ファイ (x)

x

対象となる

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

逐次二次計画法を使用します。

最初の引数はベクトルx0の初期推定値です。

2 番目の引数は、目的関数 phiを指す関数ハンドルです。目的関数は 1 つのベクトル引数を受け入れ、スカラーを返す必要があります。

2 番目の引数は、関数ハンドルの 2 要素または 3 要素のセル配列にすることもできます。最初の要素は目的関数を指し、2 番目の要素は目的関数の勾配を計算する関数を指し、3 番目の要素は目的関数のヘッセ行列を計算する関数を指す必要があります。勾配関数が指定されていない場合、勾配は有限差分によって計算されます。ヘッセ行列関数が指定されていない場合、BFGS 更新式を使用してヘッセ行列を近似します。

指定されている場合、勾配関数はphi{2}1 つのベクトル引数を受け入れ、ベクトルを返す必要があります。指定されている場合、ヘッセ関数は phi{3}1 つのベクトル引数を受け入れ、行列を返す必要があります。

3 番目と 4 番目の引数gとhは、それぞれ等式制約と不等式制約を計算する関数を指す関数ハンドルです。問題に等式 (または不等式) 制約がない場合は、 g (またはh ) に空の行列 ([]) を使用します。指定されている場合、これらの等式制約関数と不等式制約関数は 1 つのベクトル引数を受け入れ、ベクトルを返す必要があります。

3 番目と 4 番目の引数は、関数ハンドルの 2 要素セル配列にすることもできます。最初の要素は制約関数を指し、2 番目の要素は制約関数の勾配を計算する関数を指す必要があります。

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

5 番目と 6 番目の引数lbとubには、 xの下限と上限が含まれており、指定する場合はベクトルx0と同じサイズのベクトルである必要があります。境界は、等式制約gと不等式制約hと一致している必要があります。

7 番目の引数maxiter は、反復の最大回数を指定します。デフォルト値は 100 です。

8 番目の引数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

See also: qp.