まず第一に、些細なことを求めている場合は申し訳ありませんが、matlabで多変数計算と最適化ツールボックスを学習しているだけです-最適化も:)
単純な 2D 関数でmatlabの最適化ツールボックスを使用することについての理解をテストし、いくつかの極小値を見つけようとしましたが、特定の点について、matlabまたは関数は次のコメントで正確な開始点を与えてくれます:「初期点は極小値です。 . ". 勾配とユーザー提供のHessianの両方を提供しました。それがMATLABなのか私なのかわかりません。ヘシアンの定義を間違えたのかもしれませんが、すべて正しいと思います。fminunc
ランダムな開始点の場合、関数は常に適切な (最も近い) 最小値を提供します。ただし、特定のポイントでは、正確な最大値で、fminunc
上記のステートメントとまったく同じポイントが返されます。別の最適化アルゴリズムを使用する必要がありますか、それとも単にMATLABで受け入れなければならないものですか? Hessianを提供すると、それが解決されると思いました。ヘッセ行列は、問題のあるすべての点で常に負の定義の行列であり、それはその点が最大であることを意味するはずです!!! によって返された固有値を介してテストしましたeig(hessian)
。fminunc
Hessian をまったく考慮していないようです。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)