ドキュメンテーション

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

勾配付き非線形制約

通常、最小化ルーチンでは、有限差分近似により計算された数値勾配を使用します。この手順は、関数および制約の偏導関数を計算するために、各変数にシステマチックな摂動を与えます。または、関数を与えて解析的に偏導関数を計算することができます。通常は、このような関数を設定する方が、より正確で、かつ効率的に求めることができます。

次を解く方法を考えます。

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

以下の制約に従います。

x1x2 – x1 – x2 ≤ –1.5,
x1x2 ≥ –10

解析により決定された勾配を使用してこれを解くには次のようにします。

手順 1: 目的関数および勾配に対するファイルの記述

function [f,gradf] = objfungrad(x)
f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
% Gradient of the objective function:
if nargout  > 1
    gradf = [ f + exp(x(1)) * (8*x(1) + 4*x(2)), 
    exp(x(1))*(4*x(1)+4*x(2)+2)];
end

手順 2: 非線形制約およびその勾配のファイルの記述

function [c,ceq,DC,DCeq] = confungrad(x)
c(1) = 1.5 + x(1) * x(2) - x(1) - x(2); % Inequality constraints
c(2) = -x(1) * x(2)-10; 
% No nonlinear equality constraints
ceq=[];
% Gradient of the constraints:
if nargout > 2
    DC= [x(2)-1, -x(2);
        x(1)-1, -x(1)];
    DCeq = [];
end

gradfx の各要素に対して objfungrad(x) により求めた目的関数 f の偏導関数を含みます。

f=[ex1(4x12+2x22+4x1x2+2x2+1)+ex1(8x1+4x2)ex1(4x1+4x2+2)].(6-58)

DC の列は各制約の偏導関数を含みます(すなわち、DC の第 i 列は x の第 i 番目の制約の偏導関数です)。そのため上記の例では DC は次のようになります。

[c1x1c2x1c1x2c2x2]=[x21x2x11x1].(6-59)

objfungrad.m に目的関数の勾配、confungrad.m に制約の勾配を与えているので、fmincon にこれらのファイルが追加情報を含むことを示さなければなりません。optimoptions を使用して、例の既存の optionsGradObjGradConstr のオプションを 'on' にします。

options = optimoptions(options,'GradObj','on','GradConstr','on');

これらのオプションを 'on' に設定しない場合、fmincon は解析勾配を使用しません。

引数 lb および ubx の独立変数に上下限を設定します。この例では範囲制約がないので、どちらも [] に設定します。

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

x0 = [-1,1];            % Starting guess 
options = optimoptions(@fmincon,'Algorithm','sqp');
options = optimoptions(options,'GradObj','on','GradConstr','on');
lb = [ ]; ub = [ ];   % No upper or lower bounds
[x,fval] = fmincon(@objfungrad,x0,[],[],[],[],lb,ub,... 
   @confungrad,options);

結果は、次のようになります。

x,fval
x =
    -9.5474    1.0474
fval =
     0.0236

[c,ceq] = confungrad(x) % Check the constraint values at x
c =
   1.0e-13 *
   -0.1066
    0.1066

ceq =
     []
この情報は役に立ちましたか?