Main Content

ソルバーが成功する場合

ソルバー成功時に何か誤っている可能性はありますか?

ソルバーが最小化の成功を報告した場合でも、報告された解が不正確であるかもしれません。自明な例として、–2 ~ 2 の x という条件で、関数 f(x) = x3 の最小化を点 1/3 から開始して考えてみましょう。

options = optimoptions('fmincon','Algorithm','active-set');
ffun = @(x)x^3;
xfinal = fmincon(ffun,1/3,[],[],[],[],-2,2,[],options)         

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is
non-decreasing in feasible directions, to within the default  
valueof the function tolerance, and constraints were satisfied 
to within the default value of the constraint tolerance.

No active inequalities.

xfinal =
 -1.5056e-008

真の最小値は x = -2 で生じます。fmincon はこの報告を行います。なぜなら、関数 f(x) が、x = 0 付近でまったく平坦であるからです。

その他のよくある問題は、ソルバーが局所的最小値を見つけるが大域的最小値が望ましい場合です。詳細については、大域的最適解と局所的最適解を参照してください。

レッスン: ソルバーが局所的最小値を「見つけた」か方程式を「解いた」ことを報告しても、結果を確認してください。

このセクションでは、結果を検証する手法を説明します。

1.初期点の変更

初期点は解に大きい影響を及ぼすことがあります。さまざまな初期値から同じ、またはより悪い解を得ることで、得られた解がより信頼できるようになります。

たとえば、点 1/4 から開始して f(x) = x3 + x4 を最小化します。

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

Local minimum found.

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

x =
 -1.6764e-008

fval =
 -4.7111e-024

初期点を少し変更します。すると、ソルバーはよりよい解を見つけます。

[xfinal fval] = fminunc(ffun,1/4+.001,options)

Local minimum found.

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

xfinal =
   -0.7500

fval =
   -0.1055

x = -0.75 は大域的な解です。他の点から開始しても、解は改善されません。

詳細については、大域的最適解と局所的最適解を参照してください。

2.近傍点の確認

報告された解より良い値があるかどうかを確かめるために、さまざまな近傍点で目的関数と制約を評価します。

たとえば、ソルバー成功時に何か誤っている可能性はありますか?からの目的関数 ffun および最終点 xfinal = -1.5056e-008 で、いくつかの Δffun(xfinal±Δ) を計算してみましょう。

delta = .1;
[ffun(xfinal),ffun(xfinal+delta),ffun(xfinal-delta)]

ans =
   -0.0000    0.0011   -0.0009

目的関数は ffun(xfinal-Δ) でより低いため、ソルバーが不正確な解を報告したとわかります。

少し単純でない例としては:

options = optimoptions(@fmincon,'Algorithm','active-set');
lb = [0,-1]; ub = [1,1];
ffun = @(x)(x(1)-(x(1)-x(2))^2);
[x fval exitflag] = fmincon(ffun,[1/2 1/3],[],[],[],[],...
                           lb,ub,[],options)

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is
non-decreasing in feasible directions, to within the default  
valueof the function tolerance, and constraints were satisfied 
to within the default value of the constraint tolerance.

Active inequalities (to within options.ConstraintTolerance = 1e-006):
  lower      upper     ineqlin   ineqnonlin
    1                                 

x =
  1.0e-007 *
         0    0.1614

fval =
 -2.6059e-016

exitflag =
     1

近傍実行点で ffun を評価すると、解 x が真の最小値ではない、と示されます。

[ffun([0,.001]),ffun([0,-.001]),...
    ffun([.001,-.001]),ffun([.001,.001])]

ans =
  1.0e-003 *
   -0.0010   -0.0010    0.9960    1.0000

リストされた最初の 2 つの値は、計算された最小値 fval より小さい値です。

Global Optimization Toolbox ライセンスをお持ちの場合は、関数 patternsearch (Global Optimization Toolbox) を使用して、近傍点を確認することができます。

3.目的関数と制約関数の確認

目的関数と制約関数が、解こうとしている問題に対応しているかを改めて確認してください。以下のことを提案します。

  • いくつかの点で目的関数の評価を確認します。

  • 各不等式制約が正しい記号をもっていることを確認します。

  • 最大化を実行した場合は、報告された解の負の値を忘れずに取り去ります (この助言は、目的関数の負の値を最小化することにより関数を最大化したことを前提とします)。たとえば、f(x) = x – x2 を最大化するには、g(x) = –x + x2 を最小化します。

    options = optimoptions('fminunc','Algorithm','quasi-newton');
    [x fval] = fminunc(@(x)-x+x^2,0,options)
    
    Local minimum found.
    
    Optimization completed because the size of the gradient is 
    less than the default value of the function tolerance.
    
    x =
        0.5000
    
    fval =
       -0.2500

    f の最大値は 0.25、つまり fval の負の値です。

  • 実行不可能な点で関数がエラーを起こさないことを確認します。反復は制約に違反する可能性ありを参照してください。