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

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

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

ソルバーが成功した可能性がある場合

最終点が初期点と等しい

1 次の最適性の尺度が 0 に近いため、初期点は局所的最小値または解であるようです。ソルバーが初期点を改善しなかったので、この結果に不満足であるかもしれません。

初期点が本当に局所的最小値であることに確信がない場合は、以下を試します。

  1. 異なる点から開始する方法については、「初期点の変更」を参照してください。

  2. 目的関数と非線形制約関数が正しく定義されていることを確認する (たとえば、任意の点で正しい値を返すかどうか) 方法については、「目的関数と制約関数の定義を確認」を参照してください。実行不可能な点が関数のエラーを起こさないことを確認します。反復は制約に違反する可能性ありを参照してください。

  3. TolFunTolConTolX などの許容誤差を変更する方法については、「適切な許容誤差を使用」を参照してください。

  4. 問題をスケーリングして、各座標にほぼ同じ効果をもたせる方法については、「問題のリスケーリング」を参照してください。

  5. 勾配とヘッセ行列情報を与える方法については、「勾配またはヤコビ行列の供給」および「ヘッセ行列の供給」を参照してください。

局所的最小値の可能性

ソルバーが局所的最小値に到達した可能性がありますが、1 次の最適性の尺度が TolFun 許容誤差より小さくないため、確実ではありません (1 次の最適性の尺度の詳細は、「1 次の最適性の尺度」を参照してください)。報告された解が信頼できるかどうかを確かめるには、以下の提案を検討してください。

1. 滑らかでない関数
2. 最終点での開始を再実行
3. 他のアルゴリズムを試す
4. 許容誤差の変更
5. 問題のリスケーリング
6. 近傍点の確認
7. 有限差分オプションの変更
8. 解析的な勾配またはヤコビの供給
9. ヘッセ行列の供給

1. 滑らかでない関数

滑らかでない関数を最小化するか、滑らかでない制約をもちたい場合は、「局所的最小値の可能性」が最良の終了メッセージであるかもしれません。これは、1 次の最適性条件が滑らかでない点に適用されないためです。

解が適正であることを納得するために、「近傍点の確認」を試します。

2. 最終点での開始を再実行

最終点で最適化を再開すると、より良い 1 次の最適性の尺度をもつ解になる可能性があります。より良い (より低い) 1 次の最適性の尺度により、答えを信頼してもよい理由が増えます。

たとえば、例 (echodemo symbolic_optim_demo) に含まれる次の最小化問題を考えてみましょう。

options = optimoptions('fminunc','Algorithm','quasi-newton');
funh = @(x)log(1 + (x(1) - 4/3)^2 + 3*(x(2) - (x(1)^3 - x(1)))^2);
[xfinal fval exitflag] = fminunc(funh,[-1;2],options)

Local minimum possible.

fminunc stopped because it cannot decrease the 
objective function along the current search direction.

xfinal =
    1.3333
    1.0370

fval =
  8.5265e-014

exitflag =
     5

5 の終了フラグ値は、1 次の最適性の尺度が関数許容誤差より上であることを示します。xfinal から開始する最小化を再度実行します。

[xfinal2 fval2 exitflag2] = fminunc(funh,xfinal,options)

Local minimum found.

Optimization completed because the size of the gradient is 
less than the default value of the function tolerance.

xfinal2 =
    1.3333
    1.0370

fval2 =
  6.5281e-014

exitflag2 =
     1

局所的最小値は「可能」ではなく「見つかりました」であり、終了フラグは 5 ではなく 1 です。2 つの解は事実上同一です。1 次の最適性の尺度が十分に低かったため、2 番目の実行はより満足のいく終了メッセージをもちます: 3.9674e-006 の代わりに 7.5996e-007

3. 他のアルゴリズムを試す

ソルバーが多くあるため、アルゴリズムを選択できます。さまざまなアルゴリズムにより、異なる停止条件を使用することができます。

たとえば、「最終点での開始を再実行」すると、1 回目の実行から、最終フラグ 5 が返されます。この実行では、中規模アルゴリズムが使用されます。

信頼領域法アルゴリズムにはユーザー指定の勾配が必要です。betopt.m は目的関数と勾配の計算を含んでいます。

function [f gradf] = betopt(x)

g = 1 + (x(1)-4/3)^2 + 3*(x(2) - (x(1)^3-x(1)))^2;
f = log(g);
gradf(1) = 2*(x(1)-4/3) + 6*(x(2) - (x(1)^3-x(1)))*(1-3*x(1)^2);
gradf(1) = gradf(1)/g;
gradf(2) = 6*(x(2) - (x(1)^3 -x(1)))/g;

trust-region アルゴリズムを使用して最適化を実行すると、結果として異なる終了フラグになります。

options = optimoptions('fminunc','GradObj','on');
[xfinal3 fval3 exitflag3] = fminunc(@betopt,[-1;2],options)

Local minimum possible.

fminunc stopped because the final change in function value 
relative to its initial value is less than the default value 
of the function tolerance.

xfinal3 =
    1.3333
    1.0370

fval3 =
  7.6659e-012

exitflag3 =
     3

終了条件は、最良ではありませんが中規模の条件よりは良い条件です。最終点からアルゴリズムを再度実行すると、極めて小さい 1 次の最適性の尺度をもつより良い点が生成されます。

[xfinal4 fval4 eflag4 output4] = fminunc(@betopt,xfinal3,options)

Local minimum found.

Optimization completed because the size of the gradient is 
less than the default value of the function tolerance.

xfinal4 =

    1.3333
    1.0370

fval4 =
     0

eflag4 =
     1

output4 =
       iterations: 1
        funcCount: 2
     cgiterations: 1
    firstorderopt: 7.5211e-011
        algorithm: 'large-scale: trust-region Newton'
          message: [1x498 char]

4. 許容誤差の変更

許容誤差を厳しくするか緩めると、より満足できる結果をもたらすことがあります。たとえば、「他のアルゴリズム」節で TolFun のより小さな値を選択すると、以下のようになります。

options = optimoptions('fminunc','TolFun',1e-8,'GradObj','on'); % default=1e-6
[xfinal3 fval3 eflag3 output3] = fminunc(@betopt,[-1;2],options)

Local minimum found.

Optimization completed because the size of the gradient is 
less than the selected value of the function tolerance.

xfinal3 =
    1.3333
    1.0370

fval3 =
     0

eflag3 =
     1

output3 = 
         iterations: 15
          funcCount: 16
       cgiterations: 12
      firstorderopt: 7.5497e-11
          algorithm: 'large-scale: trust-region Newton'
            message: [1x498 char]
    constrviolation: []

fminunc は、以前より反復を 1 回多くし、より良い解に到達します。

5. 問題のリスケーリング

スケーリングとセンタリングを行うことにより、各座標が目的関数と制約関数へほぼ同じ効果を与えるようにします。例については、「問題のセンタリングとスケーリング」を参照してください。

6. 近傍点の確認

目的関数と制約が最終点の近くの点に存在している場合は、それらを評価します。最終点が局所的最小値である場合は、近傍実行可能点はより大きい目的関数値をもちます。例については、「近傍点の確認」を参照してください。

Global Optimization Toolbox ライセンスをお持ちの場合は、最終点から patternsearch ソルバーを実行してみてください。patternsearch は近傍点を検査し、すべてのタイプの制約を受け入れます。

7. 有限差分オプションの変更

中央有限差分は評価操作よりも時間がかかりますが、より正確です。問題が高い曲率をもつ可能性がある場合は、中央差分を使用します。

コマンド ラインで中央差分を選択するには、optimoptions を使用して、'FinDiffType' を既定の 'forward' ではなく 'central' に設定します。

最適化アプリケーションで中央差分を選択するには、[オプション]、[近似された導関数]、[タイプ][中央差分] に設定します。

8. 解析的な勾配またはヤコビの供給

勾配またはヤコビ行列を提供しない場合は、ソルバーは有限差分によって勾配とヤコビ行列を推定します。そのため、これらの導関数を提供すると、計算時間を節約し精度を高めることができる可能性があります。

制約問題の場合は、勾配を与えることで別の利点があります。ソルバーは、x が実現可能であるような点 x に到達できますが、x の周囲の有限差分は常に実行不可能な点を導きます。この場合、ソルバーは失敗するか途中で停止する可能性があります。勾配を与えることで、ソルバーは続行できます。

目的関数と非線形制約関数用に、このファイル内に勾配またはヤコビ行列を供給します。構文についての詳細は、「スカラー目的関数の記述」、「ベクトルと行列の目的関数の記述」および「非線形制約」を参照してください。

勾配またはヤコビ行列の有効性を確認」で説明されているように、勾配またはヤコビ関数が正しいことを確認するには DerivativeCheck オプションを使用します。

Symbolic Math Toolbox™ のライセンスをおもちの場合は、プログラミングによって勾配とヘッセ行列を計算することができます。例は、「Symbolic Math Toolbox による勾配とヘッセ行列の計算」を参照してください。

勾配とヤコビ行列を使用している例は、勾配およびヘッセ行列を使った最小化勾配付き非線形制約Symbolic Math Toolbox による勾配とヘッセ行列の計算解析ヤコビ行列による非線形方程式、およびヤコビ行列を使った非線形方程式を参照してください。

9. ヘッセ行列の供給

ヘッセ行列を与えると、ソルバーはより正確かつより少ない反復で作動します。

以下のソルバーとアルゴリズムはヘッセ行列を受け入れます。

Symbolic Math Toolbox のライセンスをおもちの場合は、プログラミングによって勾配とヘッセ行列を計算することができます。例は、「Symbolic Math Toolbox による勾配とヘッセ行列の計算」を参照してください。

Symbolic Math Toolbox による勾配とヘッセ行列の計算」の例は、fmincon が、ヘッセ行列なしでは 77 回反復し、ヘッセ行列を使用すると 19 回しか反復しないことを示します。

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