优化工具箱(Optimization Toolbox)
符号数学工具箱™雅可比矩阵
?matlabFunction
。一般に、优化工具箱™ソルバーの精度と効率は,目的関数と制約関数の勾配とヘッシアンが与えられた場合に向上します。
★★★★★★★★★★★★★★优化工具箱。★★★★★★★★★★★★英文:中文:。
最適化関数でシンボリックな計算を使用する際は,以下のことを考慮しなければなりません。
【中文翻译】
x
。。。最適化の勾配と,場合によりますがヘッシアンは,目的関数または制約関数の本体内で計算されることになっています。★★★★、シンボリックな勾配またはヘッシアンを、目的関数または制約関数ファイル、あるいは関数ハンドル内の適切な位置に配置する必要があることを意味します。
。★★★★★★★★★★★★★★★★★★★★★★★
matlabFunction
。関数
潜艇
。matlabFunction
★★★★★★★★matlabFunction
。fmincon
は列ベクトルを含む目的関数を呼び出すため,シンボリック変数の列ベクトルを含むmatlabFunction
。
【中文译文
我的意思是,我的意思是,我的意思是。
★★★★★★★★x1
= 4/3,x2
=(4/3)^3 - 4/3 = 1.0370…。
【中文译文x1
?x2
> > > > > >その理由は,この形式で,独立変数をシンボリック変数として使用できるからです。ベクトルx
【中文】:x (1)
とx (2)
? ? ? ? ?★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
信谊x1x2真正的X = [x1;x2];%符号变量的列向量日志(f = 1 + 3 * (x2 - (x1 ^ 3 - x1)) ^ 2 + (x1 - 4/3) ^ 2)
f =
fsurf (f (2 - 2),“ShowContours”,“上”38)视图(127)
。
=雅可比矩阵(f,x)%列梯度
gradf =
Hessf =雅可比矩阵(gradf,x)
hessf =
fminunc
ソルバーには,ベクトルxを渡し,SpecifyObjectiveGradient
オプションを真正的
に,HessianFcn
オプションを“目标”
★★★★★★★★★★★★★★★★★(f (x), gradf (x) hessf (x))
。
matlabFunction
は3つの入力のリストから3つの出力のこのリストを正確に生成します。matlabFunction
【翻译】var
。
fh = matlabFunction(f,gradf,hessf,“var”, {x});
[-1,2]“”“”“”“”
选项= optimoptions(“fminunc”,…“SpecifyObjectiveGradient”,真的,…“HessianFcn”,“目标”,…“算法”,“信赖域”,…“显示”,“最后一次”);[xfinal,fval,exitflag,output] = fminunc(fh,[-1;2],options)
局部最小值。Fminunc停止是因为函数值相对于其初始值的最终变化小于函数容差值。
xfinal =2×11.3333 - 1.0370
Fval = 7.6623e-12
Exitflag = 3
输出=带有字段的结构体:迭代:14 funcCount: 15步长:0.0027 cgiterations: 11 firstorderopt: 3.4391e-05算法:'trust-region'消息:'本地最小可能....约束:[]
。> > >“拟牛顿”
。
选项= optimoptions(“fminunc”,“显示”,“最后一次”,“算法”,“拟牛顿”);fh2 = matlabFunction(f,“var”, {x});% fh2 =物镜,无梯度或黑森[xfinal,fval,exitflag,output2] = fminunc(fh2,[-1;2],options)
找到局部最小值。优化完成是因为梯度的大小小于最优容差的值。
xfinal =2×11.3333 - 1.0371
Fval = 2.1985e-11
退出标志= 1
output2 =带有字段的结构体:迭代:18 funcCount: 81步长:2.1164e-04 lssteplength: 1 firstorderopt: 2.4587e-06算法:'准牛顿'消息:'找到本地最小值....'
反復回数は,勾配とヘッシアンを使用した場合が少なく,関数評価の回数が激減します。
sprintf ([“有%d次迭代使用梯度”…“还有黑森,但是没有他们。”],…output.iterations output2.iterations)
ans =“有14次迭代使用梯度和Hessian,但18次没有。”
sprintf ([“使用梯度有%d函数评估”…“还有黑森,但是没有他们。”],…output.funcCount output2.funcCount)
ans = '有15个函数评估使用梯度和Hessian,但81没有他们。'
【中文译文】:【中文译文
“1”、“1”、“2”、“2”、“1”、“2”、“2”、“2”、“2”、“2”、“2”、“2”、“2”、“2”、“2”、“3”、“3”、“4”、“4”、“4”、“4”、“4”、“4”。
[1.333,1.037]英文:(2)、(2)、(2)
[X,Y] = meshgrid(-2:.01:3);Z = (5*sinh(y /5) >= x ^4);当满足第一个约束时,% Z=1,否则Z=0Z = Z+ 2*(5*tanh(x /5) >= y ^2 - 1);% Z=2表示第二个满足,Z=3表示两个都满足冲浪(X, Y, Z,“线型”,“没有”);FIG = gcf;fig.Color =' w ';%白色背景视图(0,90)在plot3(。43.96, .0373, 4,“o”,“MarkerEdgeColor”,“r”,“MarkerSize”8);%最佳点包含(“x”) ylabel (“y”)举行从
。
。★★★★両方の制約を満たす領域であり、最適点の周囲の小さい赤色の円と共に濃い赤色で示されています。
W = log(1 + 3*(Y - (X) ^3 - X))^2 + (x - 4/3) ^2)% W =目标函数W(Z < 3) = nan;%仅在满足约束的地方绘制冲浪(X, Y, W,“线型”,“没有”);视图(68年,20)在plot3(。43.96, .0373, .8152,“o”,“MarkerEdgeColor”,“r”,…“MarkerSize”8);%最佳点包含(“x”) ylabel (“y”) zlabel (“z”)举行从
【中文】:C (x) <= 0
> > > > > > > > > > > > > >matlabFunction
を使用して,すべてのシンボリック制約とその導関数を計算し,関数ハンドルに配置します。
。これらは,各列が1つの制約関数の勾配を表すような行列として目的関数に配置しなければなりません。★★★★雅可比矩阵
中文:。
。fmincon
【中文翻译[c ceq gradc gradceq]
【中文翻译】:。【中文翻译】量表信
とgradceq
∕∕∕∕[]
? ? ? ?
C1 = x1^4 - 5*sinh(x2/5);C2 = x2^2 - 5*tanh(x1/5) - 1;C = [c1 c2];Gradc = jacobian(c,x).';把%转置化成正确的形式constraint = matlabFunction(c,[],gradc,[],“var”, {x});
内点法アルゴリズムでは,ヘッセ関数を,目的関数の一部ではなく別個の関数として記述しなければなりません。★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★。★★★★★★★★★★★★★★★★★★★★★★★★★★
。◆◆x
。【中文翻译】lambda.ineqnonlin
とlambda.eqnonlin
啊哈!【中文翻译】、【中文翻译】lambda.ineqnonlin (1)
とlambda.ineqnonlin (2)
> > > > > >
。★★★★★★★★★★★★★★★★matlabFunction
。
Hessc1 = jacobian(gradc(:,1),x);% constraint =第一个c列Hessc2 = jacobian(gradc(:,2),x);hessf = matlabFunction(hessf,“var”, {x});hessc1 = matlabFunction(hessc1,“var”, {x});hessc2h = matlabFunction(hessc2,“var”, {x});
最終的なヘッシアンを作成するために,3つのヘッシアンを統合し,適切なラグランジュ乗数を制約関数に追加します。
@(x,lambda)(hessfh(x) +…lambda.ineqnonlin (1) * hessc1h (x) +…lambda.ineqnonlin (2) * hessc2h (x));
内点法アルゴリズム,勾配,およびヘッシアンを使用するためのオプションを設定し,目的関数が目的と勾配の両方を返すようにし,ソルバーを実行します。
选项= optimoptions(“fmincon”,…“算法”,“内点”,…“SpecifyObjectiveGradient”,真的,…“SpecifyConstraintGradient”,真的,…“HessianFcn”myhess,…“显示”,“最后一次”);% fh2 =客观没有黑森fh2 = matlabFunction(f,gradf,“var”, {x});[xfinal,fval,exitflag,output] = fmincon(fh2,[-1;2],…[],[],[],[],[],[], 约束,选项)
找到满足约束的局部最小值。由于目标函数在可行方向上不减小,优化完成到最优性容限范围内,约束满足到约束容限范围内。
xfinal =2×10.4396 - 0.0373
Fval = 0.8152
退出标志= 1
输出=带有字段的结构体:迭代:10 funcCount: 13 constrviolation: 0 stepsize: 1.9160e-06算法:' internal -point' firstorderopt: 1.9217e-08 cgiterations: 0消息:'满足约束的局部最小值发现....最佳可行:[1x1 struct]
この例でも,勾配とヘッシアンが与えられている場合の方がそうでない場合よりも,ソルバーによって反復と関数評価の回数が少なくなっています。
选项= optimoptions(“fmincon”,“算法”,“内点”,…“显示”,“最后一次”);% fh3 =无梯度或黑森物镜fh3 = matlabFunction(f,“var”, {x});没有梯度的%约束:constraint = matlabFunction(c,[],“var”, {x});[xfinal,fval,exitflag,output2] = fmincon(fh3,[-1;2],…[],[],[],[],[],[], 约束,选项)
找到目标函数值较低的可行点。找到满足约束的局部最小值。由于目标函数在可行方向上不减小,优化完成到最优性容限范围内,约束满足到约束容限范围内。
xfinal =2×10.4396 - 0.0373
Fval = 0.8152
退出标志= 1
output2 =带有字段的结构体:迭代:18 funcCount: 57 constrviolation: 0 stepsize: 9.6632e-07算法:' internal -point' firstorderopt: 3.8435e-07 cgiterations: 0消息:'满足约束的局部最小值找到....最佳可行:[1x1 struct]
sprintf ([“有%d次迭代使用梯度”…“还有黑森,但是没有他们。”],…output.iterations output2.iterations)
ans =“有10次迭代使用梯度和黑森,但18次没有。”
sprintf ([“使用梯度有%d函数评估”…“还有黑森,但是没有他们。”],…output.funcCount output2.funcCount)
ans = '有13个函数评估使用梯度和Hessian,但57没有他们。'
シンボリック変数のクリーンアップ
この例で使用したシンボリック変数は,実数であると想定されていました。この想定をシンボリックエンジンワークスペースから取り除くには,これらの変数を削除するだけでは不十分です。。
假设((x1, x2),“清楚”)
。
假设((x1, x2))
ans =空sym: 1 × 0