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

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

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

解析的ヘッセ行列を使用した fmincon の内点法アルゴリズム

fmincon の内点法アルゴリズムは入力にヘッセ関数を受け入れることができます。ヘッセ行列を与えると、制約付き最小化問題は効率的に解くことができ、より正確な解を得ることができます。

この例の制約集合は 2 つの円錐の内部交差部分です。1 つの円錐は上向きで、もう 1 つの円錐は下向きです。制約関数 c は各円錐に 1 要素ずつあるため 2 要素のベクトルになります。これは 3 次元の例であるため、制約 c の勾配は 3 行 2 列の行列です。

function [c ceq gradc gradceq] = twocone(x)
% This constraint is two cones, z > -10 + r
% and z < 3 - r

ceq = [];
r = sqrt(x(1)^2 + x(2)^2);
c = [-10+r-x(3);
    x(3)-3+r];

if nargout > 2

    gradceq = [];
    gradc = [x(1)/r,x(1)/r;
       x(2)/r,x(2)/r;
       -1,1];

end

x(1) 座標が負の場合、目的関数は急速に負になります。その勾配は 3 要素のベクトルです。

function [f gradf] = bigtoleft(x)
% This is a simple function that grows rapidly negative
% as x(1) gets negative
%
f=10*x(1)^3+x(1)*x(2)^2+x(3)*(x(1)^2+x(2)^2);

if nargout > 1

   gradf=[30*x(1)^2+x(2)^2+2*x(3)*x(1);
       2*x(1)*x(2)+2*x(3)*x(2);
       (x(1)^2+x(2)^2)];

end

以下はこの問題のプロットです。色の違いにより目的関数の値を表します。目的関数が x = [-6.5,0,-3.5] のまわりで最小化されていることがわかります。

 図を生成するコード

ラグランジュ行列のヘッセ行列は以下の式によって与えられます。

以下の関数は点 x でのヘッセ行列をラグランジュ乗数構造体 lambda を用いて計算します。

function h = hessinterior(x,lambda)

h = [60*x(1)+2*x(3),2*x(2),2*x(1);
    2*x(2),2*(x(1)+x(3)),2*x(2);
    2*x(1),2*x(2),0];% Hessian of f
r = sqrt(x(1)^2+x(2)^2);% radius
rinv3 = 1/r^3;
hessc = [(x(2))^2*rinv3,-x(1)*x(2)*rinv3,0;
    -x(1)*x(2)*rinv3,x(1)^2*rinv3,0;
    0,0,0];% Hessian of both c(1) and c(2)
h = h + lambda.ineqnonlin(1)*hessc + lambda.ineqnonlin(2)*hessc;

fmincon の内点法アルゴリズムを使用してこの問題を実行します。最適化アプリケーションを使用してこれを行うには以下のようにします。

  1. 以下の図のように問題を設定します。

  2. 反復出力の場合は、[オプション] ペインの下部へスクロールし、[表示レベル][各反復] を選択します。

  3. [オプション] ペインに解析的なヘッセ行列の関数ハンドルを与えます。

  4. [ソルバーを実行して結果を表示] の下にある [開始] をクリックします。

コマンド ラインで最小化を行うには以下のようにします。

  1. 以下のように options を設定します。

    options = optimoptions(@fmincon,'Algorithm','interior-point',...
            'Display','off','GradObj','on','GradConstr','on',...
            'Hessian','user-supplied','HessFcn',@hessinterior);
  2. options 構造体を使用して初期点を [–1,–1,–1] とし、fmincon を実行します。

    [x fval mflag output] = fmincon(@bigtoleft,[-1,-1,-1],...
               [],[],[],[],[],[],@twocone,options)

出力は、次のようになります。

x =
   -6.5000   -0.0000   -3.5000

fval =
  -2.8941e+03

mflag =
     1

output = 
         iterations: 6
          funcCount: 7
    constrviolation: 0
           stepsize: 3.0479e-05
          algorithm: 'interior-point'
      firstorderopt: 5.9812e-05
       cgiterations: 3
            message: [1x777 char]

ヘッセ関数を使用しない場合、fmincon は収束するまでに 6 回ではなく 9 回の反復を行います。

options = optimoptions(@fmincon,'Algorithm','interior-point',...
        'Display','off','GradObj','on','GradConstr','on');

[x fval mflag output]=fmincon(@bigtoleft,[-1,-1,-1],...
           [],[],[],[],[],[],@twocone,options)

x =
   -6.5000   -0.0000   -3.5000

fval =
  -2.8941e+03

mflag =
     1

output = 
         iterations: 9
          funcCount: 13
    constrviolation: 2.9391e-08
           stepsize: 6.4842e-04
          algorithm: 'interior-point'
      firstorderopt: 1.4235e-04
       cgiterations: 0
            message: [1x777 char]

両方の実行結果は同様の解になりますが、F-count と反復数は解析的なヘッセ行列を使うと小さくなります。

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