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

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

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

範囲制約および範囲付きの前提条件子を使った最小化

この問題のゴールは、次の非線形関数を最小化することです。

条件は -10.0 ≤ xi ≤ 10.0 です。ここで n は 800 (n 4 の倍数になります)、p = 7/3、x0 = xn + 1 = 0 です。

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

tbroyfg.m ファイルは関数値と勾配を計算します。このファイルは長すぎるため、ここでは記述しません。次のコマンドを使用すると、この関数のコードを確認することができます。

type tbroyfg

ヘッセ行列のスパース パターンは事前定義され、ファイル tbroyhstr.mat に保存されています。この問題のヘッセ行列に関するスパース構造は、次の spy プロットのように縞模様になっています。

load tbroyhstr
spy(Hstr)

このプロットでは、中央のストライプは、5 つの縞模様の行列です。以下のプロットは、行列をより明示的に示します。

spy(Hstr(1:20,1:20))

optimoptions を使用して HessPattern パラメーターを Hstr に設定してください。この問題と同じ規模の問題が明らかにスパース構造をもつ場合、パラメーター HessPattern を設定しないと、不必要に膨大なメモリと計算量を必要とします。これは fmincon が 640,000 要素すべてを非ゼロと見なしたヘッセ行列で有限差分を使用しようとするために起こります。

また、勾配が tbroyfg.m で計算されるため、optimoptions を使用して GradObj パラメーターを 'on' に設定しなければなりません。そして、手順 2 で説明するように fmincon を実行します。

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

fun = @tbroyfg;
load tbroyhstr          % Get Hstr, structure of the Hessian
n = 800;
xstart = -ones(n,1); xstart(2:2:n) = 1;
lb = -10*ones(n,1); ub = -lb;
options = optimoptions('fmincon','GradObj','on','HessPattern',Hstr,...
    'Algorithm','trust-region-reflective'); 

[x,fval,exitflag,output] = ... 
   fmincon(fun,xstart,[],[],[],[],lb,ub,[],options);

7 回の反復の後、exitflagfvaloutput は次のようになります。

exitflag =
     3

fval =
  270.4790

output = 
         iterations: 7
          funcCount: 8
       cgiterations: 18
      firstorderopt: 0.0163
          algorithm: 'trust-region-reflective'
            message: [1x471 char]
    constrviolation: 0

範囲制約の問題に対して 1 次の最適性は v.*g の無限大ノルムです。ここで vボックス制約 のように定義され、g は勾配です。

5 つの縞模様の中央ストライプであるために、既定の対角型の前提条件の代わりに、5 つの縞模様の前提条件を使用して、解を改善することができます。関数 optimoptions を使用してパラメーター PrecondBandWidth2 にリセットして再度問題を解いてください。帯域幅 は、主対角をカウントせず、上 (または下) 対角の数です。

fun = @tbroyfg;
load tbroyhstr          % Get Hstr, structure of the Hessian
n = 800;
xstart = -ones(n,1); xstart(2:2:n,1) = 1;
lb = -10*ones(n,1); ub = -lb;
options = optimoptions('fmincon','GradObj','on','HessPattern',Hstr, ...
    'Algorithm','trust-region-reflective','PrecondBandWidth',2); 
[x,fval,exitflag,output] = ...
   fmincon(fun,xstart,[],[],[],[],lb,ub,[],options); 

実際、反復数は 2 ずつ上がりますが、CG の反復の総数は 18 から 15 に落ちます。1 次の最適性の尺度は 1e-3 のオーダー (桁) 小さくなります。

exitflag =
     3

fval =
  270.4790

output = 
         iterations: 9
          funcCount: 10
       cgiterations: 15
      firstorderopt: 7.5340e-05
          algorithm: 'trust-region-reflective'
            message: [1x471 char]
    constrviolation: 0
この情報は役に立ちましたか?