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

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

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

勾配およびヘッセ行列にスパース パターンを使った最小化

ここでも同じ問題を解きますが、明示的な計算の代わりにヘッセ行列をスパース有限差分法により近似します。fminunctrust-region メソッドを使用するには、fun で勾配を計算しなければなりません。これは quasi-newton メソッドとは異なり、オプションではありません。

brownfg ファイルは目的関数と勾配を計算します。

手順 1: 目的関数およびその勾配を計算するファイル brownfg.m を記述します。

この関数ファイルはソフトウェアとともに提供されています。

function [f,g] = brownfg(x)
% BROWNFG Nonlinear minimization test problem
% 
% Evaluate the function
n=length(x); y=zeros(n,1);
i=1:(n-1);
y(i)=(x(i).^2).^(x(i+1).^2+1) + ...
        (x(i+1).^2).^(x(i).^2+1);
  f=sum(y);
% Evaluate the gradient if nargout > 1
  if nargout > 1
     i=1:(n-1); g = zeros(n,1);
     g(i) = 2*(x(i+1).^2+1).*x(i).* ...
              ((x(i).^2).^(x(i+1).^2))+ ...
              2*x(i).*((x(i+1).^2).^(x(i).^2+1)).* ...
              log(x(i+1).^2);
     g(i+1) = g(i+1) + ...
              2*x(i+1).*((x(i).^2).^(x(i+1).^2+1)).* ...
              log(x(i).^2) + ...
              2*(x(i).^2+1).*x(i+1).* ...
              ((x(i+1).^2).^(x(i).^2));
  end

ヘッセ行列 H(x) のスパース有限差分近似の計算を効率的に行うために、H のスパース構造を事前に決めておかなければなりません。ここでは、事前に構造が分かっているあるスパース行列 Hstr がファイル brownhstr.mat で利用可能とします。spy コマンドを使用すると、Hstr がスパースであること (非ゼロは 2998 個のみ) を確認することができます。optimoptions を使用して HessPattern オプションを Hstr に設定してください。この問題と同じ規模の問題が明らかにスパース構造をもつ場合、HessPattern オプションを設定しないと、fminunc は 100 万要素をもつ非スパースなヘッセ行列に有限差分を使おうとするため、不必要なメモリと計算量を膨大に必要とします。

また、勾配が brownfg.m で計算されるため、optimoptions を使用して GradObj オプションを 'on' に設定しなければなりません。そして、手順 2 に説明されているように fminunc を実行します。

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

fun = @brownfg;
load brownhstr          % Get Hstr, structure of the Hessian
spy(Hstr)               % View the sparsity structure of Hstr

n = 1000;
xstart = -ones(n,1); 
xstart(2:2:n,1) = 1;
options = optimoptions(@fminunc,'GradObj','on','HessPattern',Hstr);
[x,fval,exitflag,output] = fminunc(fun,xstart,options); 

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

exitflag,fval,output

exitflag =
     1

fval =
   7.4738e-17

output = 
         iterations: 7
          funcCount: 8
       cgiterations: 7
      firstorderopt: 7.9822e-10
          algorithm: 'large-scale: trust-region Newton'
            message: [1x496 char]
    constrviolation: []
この情報は役に立ちましたか?