非線形の等式制約と不等式制約
この例では、非線形制約を含む最適化問題を解く方法を説明します。等式と不等式の両方の制約値を計算する関数を記述することにより、非線形制約を含めます。非線形制約関数は次の構文を使用します。
[c,ceq] = nonlinconstr(x)
関数 c(x)
は、制約 c(x) <= 0
を表します。関数 ceq(x)
は、制約 ceq(x) = 0
を表します。
メモ: 非線形制約のタイプが 1 つしかない場合でも、非線形制約関数は c(x)
と ceq(x)
の両方を返さなければなりません。制約が存在しない場合、関数がその制約について []
を返すようにします。
非線形制約
非線形等式制約は以下のとおりとします。
そして、非線形不等式制約は以下のとおりとします。
.
これらの制約を、次のように書き換えます。
補助関数 confuneq
(この例の終わりに掲載) は、これらの不等式を正しい構文で実装するものです。
目的関数
問題を解く
これは、先の制約に従います。補助関数 objfun
(この例の終わりに掲載) は、この目的関数を実装するものです。
問題を解く
fmincon
ソルバーを呼び出して問題を解きます。このソルバーは初期点を必要とします。初期点には、x0 = [-1,-1]
を使用します。
x0 = [-1,-1];
この問題には範囲または線形制約がないため、これらの入力を []
に設定します。
A = []; b = []; Aeq = []; beq = []; lb = []; ub = [];
ソルバーを呼び出します。
[x,fval] = fmincon(@objfun,x0,A,b,Aeq,beq,lb,ub,@confuneq)
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 = 1×2
-0.7529 0.4332
fval = 1.5093
ソルバーは、制約がこの解において満たされることを報告します。この解における非線形制約を確認します。
[c,ceq] = confuneq(x)
c = -9.6739
ceq = 2.0668e-12
必要に応じて、c
は 0 よりも小さくなります。ceq
は 1e-6
に関する制約の既定の許容誤差内で 0 に等しくなります。
補助関数
次のコードは補助関数 confuneq
を作成します。
function [c,ceq] = confuneq(x) % Nonlinear inequality constraints c = -x(1)*x(2) - 10; % Nonlinear equality constraints ceq = x(1)^2 + x(2) - 1; end
次のコードは補助関数 objfun
を作成します。
function f = objfun(x) f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1); end