Main Content

非線形不等式制約

この例では、非線形不等式制約を使ってスカラー最小化の問題を解く方法を示します。次式を解く x を求めます。

minxf(x)=ex1(4x12+2x22+4x1x2+2x2+1),

以下の制約に従います。

x1x2-x1-x2-1.5x1x2-10.

いずれの制約も線形でないため、両方の制約の値をベクトル c で返す関数 confun.m を作成します。fmincon ソルバーは c(x) 0 の形式で記述される制約を前提としているため、次の値を返すように制約関数を記述します。

c(x)=[x1x2-x1-x2+1.5-10-x1x2].

目的関数の作成

補助関数 objfun (この例の終わりに掲載) が目的関数になります。引数 fun を関数ハンドルとして関数 objfun に設定します。

fun = @objfun;

非線形制約関数の作成

非線形制約関数は、不等式制約である c と等式制約である ceq の 2 つの引数を返さなければなりません。この問題には等式制約がないため、補助関数 confun (この例の終わりに掲載) は、[] を等式制約として返します。

問題を解く

初期点を [-1,1] に設定します。

x0 = [-1,1];

この問題には、範囲または線形制約がありません。これらの引数を [] に設定します。

A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];

fmincon を使用して、問題を解きます。

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@confun)
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

   -9.5473    1.0474

fval = 0.0236

解の検証

終了メッセージは、解がその制約に関して実行可能であることを示します。改めて確認するために、解における非線形制約関数を評価します。負の値は制約が満たされていることを示します。

[c,ceq] = confun(x)
c = 2×1
10-4 ×

   -0.3179
   -0.3063

ceq =

     []

両方の非線形制約は負でありゼロに近い値となっています。このことは、解が実行可能であり、両方の制約がこの解においてアクティブであることを示しています。

補助関数

次のコードは、補助関数 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

次のコードは、補助関数 confun を作成します。

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

関連するトピック