ドキュメンテーション

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

勾配およびヘッセ行列を使った最小化

この例では、明示的な三重対角ヘッセ行列 H(x) を使用して非線形最小化問題を解く方法を説明します。

この問題は以下を最小化する x を見つけるものです。

f(x)=i=1n1((xi2)(xi+12+1)+(xi+12)(xi2+1)),(6-16)

ここで n = 1000 です。

手順 1: 目的関数、目的関数の勾配、およびスパース三重対角ヘッセ行列を計算するファイル brownfgh.m を記述します。

このファイルは長すぎるため、ここでは記述しません。次のコマンドによりコードを確認することができます。

type brownfgh

brownfgh が勾配およびヘッセ行列値を目的関数と同様に計算するため、optimoptions を使用して GradObj および Hessian オプションを使用する brownfgh でこの情報が使用可能であることを示す必要があります。

手順 2: 開始点 xstart を使って非線形最小化ルーチンを呼び出します。

n = 1000;
xstart = -ones(n,1);
xstart(2:2:n,1) = 1;
options = optimoptions(@fminunc,'Algorithm','trust-region',...
    'GradObj','on','Hessian','on');
[x,fval,exitflag,output] = fminunc(@brownfgh,xstart,options);

変数が 1000 個の問題において、7 回の反復と 7 回の共役勾配反復で、収束を表す正の exitflag が示されます。解 x での最終関数値とその最適性の尺度はどちらもゼロに近くなっています。fminunc に対して、1 次の最適性は関数の勾配の無限大ノルムであり、局所的最小値でゼロになります。

fval,exitflag,output

fval =
   2.8709e-17

exitflag =
     1

output = 
         iterations: 7
          funcCount: 8
       cgiterations: 7
      firstorderopt: 4.7948e-10
          algorithm: 'trust-region'
            message: 'Local minimum found.

Optimization completed because the size o...'
    constrviolation: []

関連する例

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