ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

勾配付き非線形制約

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

次のような式について考えます。

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

手順 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 の偏導関数を含みます。

(6-59)

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

(6-60)

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

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

options 構造体のこれらのパラメーターを '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 =
     []
この情報は役に立ちましたか?