Main Content

非線形制約

いくつかの最適化ソルバーは、fminconfseminffgoalattainfminimaxGlobal Optimization Toolbox ソルバー ga (Global Optimization Toolbox)gamultiobj (Global Optimization Toolbox)patternsearch (Global Optimization Toolbox)paretosearch (Global Optimization Toolbox)GlobalSearch (Global Optimization Toolbox)MultiStart (Global Optimization Toolbox) などの非線形制約を受け入れます。非線形制約では、平滑化関数で表すことができる任意の領域に解を制限できます。

非線形不等式制約は c(x) ≤ 0 の形式をもちます。ここで c は制約のベクトルであり、各制約に 1 つの要素が対応します。同様に、非線形等式制約は ceq(x) = 0 の形式になります。

メモ

非線形制約関数は cceq、つまり不等式と等式制約の両方を必ず出力します。これは両方共が存在しない場合でも当てはまります。存在しない制約には空のエントリ [] を返します。

たとえば、以下の不等式を制約として考えてみましょう。

x129+x2241,x2x121.

これらの制約を関数ファイルに以下のように記述します。

function [c,ceq] = ellipseparabola(x)
c(1) = (x(1)^2)/9 + (x(2)^2)/4 - 1;
c(2) = x(1)^2 - x(2) - 1;
ceq = [];
end
ellipseparabola は、非線形等式制約関数 ceq に空のエントリ [] を返します。また 2 番目の不等式は ≤ 0 の形式に書き換えられます。

関数 exp(x(1) + 2*x(2))ellipseparabola 制約の下で最小化します。

fun = @(x)exp(x(1) + 2*x(2));
nonlcon = @ellipseparabola;
x0 = [0 0];
A = []; % No other constraints
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

x =

   -0.2500   -0.9375

制約関数に勾配を含める

c と ceq の勾配を指定すると、ソルバーの実行速度が上がり、より信頼できる結果が得られます。

勾配を与えることで別の利点があります。ソルバーは、x それ自体は実行可能だが、x の周囲の有限差分は常に実行不可能な点へ導くような点 x に到達することがあります。この場合、ソルバーは失敗するか途中で停止する可能性があります。勾配を与えることで、ソルバーは続行できます。

勾配情報を含めるには以下のように条件付きの関数を記述します。

function [c,ceq,gradc,gradceq] = ellipseparabola(x)
c(1) = x(1)^2/9 + x(2)^2/4 - 1;
c(2) = x(1)^2 - x(2) - 1;
ceq = [];

if nargout > 2
    gradc = [2*x(1)/9, 2*x(1); ...
             x(2)/2, -1];
    gradceq = [];
end

条件付き関数の詳細については、スカラー目的関数の記述を参照してください。勾配行列は以下の形式をもちます。

gradci, j = [∂c(j)/∂xi].

勾配行列の最初の列は c(1) と関連し、2 番目の列は c(2) と関連します。この微分形式はヤコビアンの転置型になります。

ソルバーに非線形制約の勾配を使用させるには、optimoptions を使用してこれらが存在することを指示します。

options = optimoptions(@fmincon,'SpecifyConstraintGradient',true);

オプション構造体を必ずソルバーに渡すようにしてください。

[x,fval] = fmincon(@myobj,x0,A,b,Aeq,beq,lb,ub, ...
           @ellipseparabola,options)

Symbolic Math Toolbox™ のライセンスをおもちの場合は、勾配とヘッシアンを自動的に計算することができます (Symbolic Math Toolbox を使用した勾配とヘッシアンの計算を参照)。

非線形制約の無名関数

非線形制約関数では、2 つの出力が返されなければなりません。最初の出力は非線形不等式に、2 番目の出力は非線形等式に対応します。

無名関数は 1 つの出力のみを返します。では、無名関数を非線形制約として記述するにはどうすればよいでしょうか。

関数 deal は複数の出力を生成します。たとえば、以下の非線形不等式があるとします。

x129+x2241,x2x12-1.

非線形等式は以下のとおりとします。

x2=tanh(x1).

非線形制約関数は以下のように記述します。

c = @(x)[x(1)^2/9 + x(2)^2/4 - 1;
        x(1)^2 - x(2) - 1];
ceq = @(x)tanh(x(1)) - x(2);
nonlinfcn = @(x)deal(c(x),ceq(x));

関数 cosh(x1) + sinh(x2)nonlinfcn の制約に従って最小化するには、fmincon を使用します。

obj = @(x)cosh(x(1))+sinh(x(2));
opts = optimoptions(@fmincon,'Algorithm','sqp');
z = fmincon(obj,[0;0],[],[],[],[],[],[],nonlinfcn,opts)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
z = 2×1

   -0.6530
   -0.5737

結果の点 z が制約をどの程度満たすかをチェックするには、nonlinfcn を使用します。

[cout,ceqout] = nonlinfcn(z)
cout = 2×1

   -0.8704
         0

ceqout = 0

z は、ConstraintTolerance 制約の既定の許容誤差、1e-6 内ですべての制約を満たしています。

無名目的関数の詳細については、無名関数の目的関数を参照してください。

参考

| | (Global Optimization Toolbox) | (Global Optimization Toolbox) | (Global Optimization Toolbox) | (Global Optimization Toolbox)

関連するトピック