1

まず第一に、些細なことを求めている場合は申し訳ありませんが、matlabで多変数計算と最適化ツールボックスを学習しているだけです-最適化も:)

単純な 2D 関数でmatlabの最適化ツールボックスを使用することについての理解をテストし、いくつかの極小値を見つけようとしましたが、特定の点について、matlabまたは関数は次のコメントで正確な開始点を与えてくれます:「初期点は極小値です。 . ". 勾配ユーザー提供のHessianの両方を提供しました。それがMATLABなのか私なのかわかりません。ヘシアンの定義を間違えたのかもしれませんが、すべて正しいと思います。fminunc

ランダムな開始点の場合、関数は常に適切な (最も近い) 最小値を提供します。ただし、特定のポイントでは、正確な最大値で、fminunc上記のステートメントとまったく同じポイントが返されます。別の最適化アルゴリズムを使用する必要がありますか、それとも単にMATLABで受け入れなければならないものですか? Hessianを提供すると、それが解決されると思いました。ヘッセ行列は、問題のあるすべての点で常に負の定義の行列であり、それはその点が最大であることを意味するはずです!!! によって返された固有値を介してテストしましたeig(hessian)fminuncHessian をまったく考慮していないようです。fminuncヘシアンを扱うにはどうすればよいですか?

乾杯! 間違っている


点:fminunc

x0 = [0 -1.5*pi];
x = fminunc(F,x0,options)/pi
x =
         0   -1.5000

x0 = [pi -pi/2];
x = fminunc(F,x0,options)/pi
x =
    1.0000   -0.5000

x0 = [-pi 1.5*pi];
x = fminunc(F,x0,options)/pi
x =
   -1.0000    1.5000

たとえば、最後のポイントの場合:

[minimum,gradient,hessian] = F([-pi 1.5*pi])
minimum =
     1
gradient =
   1.0e-15 *
   -0.1225    0.1837
hessian =
   -1.0000   -0.0000
   -0.0000   -1.0000





以下のコードを使用しました。


  • 図形を描画するには:

    [X,Y]=meshgrid(-2*pi:4*pi/100:2*pi,-2*pi:4*pi/100:2*pi);
    FF = @(X,Y) cos(X).*sin(Y);
    surf(X,Y,FF(X,Y));
    shading interp;
    


  • 極小値をテストしている関数を含むコード:

    options = optimset('GradObj','on','Hessian','user-supplied','Display','iter');
    F = @(x) deal(cos(x(1)).*sin(x(2)), [-sin(x(1)).*sin(x(2)) cos(x(1)).*cos(x(2))], [-cos(x(1)).*sin(x(2)) -sin(x(1)).*cos(x(2)); -sin(x(1)).*cos(x(2)) -cos(x(1)).*sin(x(2))]);
    x0 = [0 pi/2];
    x = fminunc(F,x0,options)
    
  • 4

    0 に答える 0