ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

非線形の等式制約と不等式制約

非線形制約は、等式と不等式の両方の制約値を計算する関数を記述することにより含むことができます。非線形制約関数は次の構文を使用します。

[c,ceq] = nonlinconstr(x)

関数 c(x) は、制約 c(x) <= 0 を表します。関数 ceq(x) は、制約 ceq(x) = 0 を表します。

    メモ:   非線形制約のタイプが 1 つしかない場合でも、非線形制約関数は c(x)ceq(x) の両方を返さなければなりません。制約が存在しない場合、関数がその制約について [] を返すようにします。

たとえば、非線形等式制約 x12+x2=1 および非線形不等式制約 x1x2 ≥ –10 がある場合、これを以下のように書き換えてください。

x12+x21=0,x1x2100,

そして以下のように問題を解きます。

手順 1: ファイル objfun.m を記述します。

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);

手順 2: 非線形制約のファイル confuneq.m を記述します。

function [c,ceq] = confuneq(x)
% Nonlinear inequality constraints
c = -x(1)*x(2) - 10;
% Nonlinear equality constraints
ceq = x(1)^2 + x(2) - 1;

手順 3: 制約付き最適化ルーチンの呼び出し

x0 = [-1,1]; % Make a starting guess at the solution
options = optimoptions(@fmincon,'Algorithm','sqp');
[x,fval] = fmincon(@objfun,x0,[],[],[],[],[],[],... 
   @confuneq,options);

21 回の関数評価の後、出力される解は、次のとおりです。

x,fval
x =
   -0.7529    0.4332
fval =
    1.5093

[c,ceq] = confuneq(x) % Check the constraint values at x

c =
   -9.6739
ceq =
   5.3291e-15

ceq は制約の既定許容誤差 1.0e-006 内に収まっているため 0 とみなされ、c は目的どおりゼロ以下になっていることに注目してください。

関連する例

この情報は役に立ちましたか?