このページ最新ではありませ。をクリックし,英语のの最新版版を参照参照し。
Optimization Toolbox™ ソルバーによる記号数学の使用
この例では、Symbolic Math Toolbox™ の関数jacobian
およびmatlabfunction
を使用,的な导关数数を化ソルバーににををを说明说明说明说明しししますますますますます。に,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ソルバーソルバーソルバーソルバーソルバーソルバーソルバーソルバーソルバーの精度ととと效率效率效率します。
问题ベース化で,勾配を的计算して使用できます。Optimization Toolbox の自動微分(优化工具箱)を参照しください。自動微分を使用した問題ベースの例については、静電学における制約付き非線形最適化、問題ベース(优化工具箱)を参照しください。
最適化関数でシンボリックな計算を使用する際は、以下のことを考慮しなければなりません。
最适の关数と制约关数,,
x
のように、ベクトルで定義する必要があります。ただし、シンボリック変数はベクトル値ではなく、スカラーまたは複素数値です。このため、ベクトルとスカラー間の変換が必要です。最化勾配,场合ますがヘッシアンは,目的制约制约关数关数のの本体本体本体内内で计算さされるれることになっことになってていいますます。。これこれはははは,シンボリック勾配またはまたはまたはまたは内の位置にする必要がこと意味意味します。
勾配とシンボリック计算には,がことがますます。このこのためためため,,,ソルバーの実行中中に呼び出す呼び出す呼び出す呼び出すためためため
matlabfunction
を使用してコードを生成する必要があります。関数
subs
を使用たの评価には时间がかかります。matlabfunction
を使用たが,に效率的。。matlabfunction
は、入力ベクトルの方向に依存するコードを生成します。Fmincon
は列含む关数を呼び出すため変数の列ベクトル含む含むmatlabfunction
を呼び出す際は注意しなければなりません。
第1の例:ヘッシアンを使用した制約なし最小化
最小する关数はのとおりです。
この関数は正であり、x1
= 4/3,x2
=(4/3)^3 - 4/3 = 1.0370... において固有の最小値ゼロに到達します。
独立変数をx1
およびx2
として記述します。その理由は、この形式で、独立変数をシンボリック変数として使用できるからです。ベクトルx
の要素として,x(1)
とx(2)
と记述ますこの关数,のプロット示したように,曲がりくねったた谷ををいいい
符号x1x2realx = [x1; x2];% column vector of symbolic variablesf = log(1 + 3*(x2 - (x1^3- x1))^2 +(x1-4/3)^2)
f =
fsurf(f,[-2 2],'ShowContours','on') view(127,38)
fの勾配ヘッシアン计算し。。
gradf = jacobian(f,x)。% column gradf
gradf =
hessf = jacobian(gradf,x)
hessf =
fminunc
ソルバーベクトルベクトルx xを渡し,,SpecifyObjectiveGradient
オプションをtrue
に、Hessianfcn
オプションを'客观的'
に設定して、次の 3 つの出力のリストを与えます。[F(x),Gradf(X),HESSF(x)]
。
matlabfunction
は、3 つの入力のリストから 3 つの出力のこのリストを正確に生成します。matlabfunction
はさらに,vars
オプションをしベクトル入力を受け取り。。
fh = matlabfunction(F,Gradf,Hessf,'vars',{X});
点 [-1,2] から始めて、最小化問題を解きます。
选项= optimoptions('fminunc',...“指定目标gradient”, 真的,...'HessianFcn','客观的',...'算法','trust-region',...'展示','最后');[xfinal,fval,exitflag,output] = fminunc(fh,[-1; 2],选项)
Local minimum possible. fminunc stopped because the final change in function value relative to its initial value is less than the value of the function tolerance.
xfinal =2×11.3333 1.0370
fval = 7.6623e-12
exitflag = 3
output =struct with fields:iterations: 14 funcCount: 15 stepsize: 0.0027 cgiterations: 11 firstorderopt: 3.4391e-05 algorithm: 'trust-region' message: '...' constrviolation: []
これをまたヘッセ情报使用ない场合反复の回数と比较比较しします。。'quasi-newton'
アルゴリズムが必要になります。
选项= optimoptions('fminunc','展示','最后','算法','quasi-newton');fh2 = matlabfunction(f,'vars',{X});% fh2 = objective with no gradient or Hessian[xfinal,fval,exitflag,output2] = fminunc(fh2,[-1;2],options)
找到局部最低限度。完成优化是因为梯度的大小小于最佳公差的值。
xfinal =2×11.3333 1.0371
fval = 2.1985e-11
exitflag = 1
output2 =struct with fields:迭代:18 funccount:81步骤:2.1164E-04 lssteplength:1 firstorderopt:2.4587e-06算法:'quasi-newton'消息:'...'
反復回数は、勾配とヘッシアンを使用した場合が少なく、関数評価の回数が激減します。
sprintf(['There were %d iterations using gradient'...“还有黑森州,但没有他们的%d。”],,...output.iterations,output2.iterations)
ans = 'There were 14 iterations using gradient and Hessian, but 18 without them.'
sprintf([“使用梯度进行%D功能评估”...“还有黑森州,但没有他们的%d。”],,...output.funcCount,output2.funcCount)
Ans ='使用梯度和Hessian进行了15个函数评估,但没有它们81个。”
2の:fminconのの法アルゴリズム使用た制约付き小化化
第 1 の例と同じ目的関数と開始値を検討しますが、第 2 の例には 2 つの非線形制約があります。
この制約により、最適化が大域的最小点 [1.333,1.037] から離されます。この 2 つの制約を視覚化します。
[x,y] = meshgrid(-2:.01:3);z =(5*sinh(y./5)> = X.^4);% Z=1 where the first constraint is satisfied, Z=0 otherwiseZ= Z+ 2*(5*tanh(X./5) >= Y.^2 - 1);%z = 2,其中第二个满足,z = 3,两个surf(X,Y,Z,'linestyle','none');无花果= GCF;图。彩色='w';白色背景%view(0,90) holdonplot3(.4396,.0373,4,'o',“标记为彩色”,'r','MarkerSize',8);% best pointXlabel('x') ylabel('y') holdoff
最适点周囲小さいの円をしました。
可能领域目的关数のががます。これ両方制约制约を満たす领域领域领域领域でありでありであり,,最最のの周囲のの赤色赤色のの円と
w = log(1 + 3*(y - (x.^3 -x))。^2 +(x -4/3)。^2);%w =目标函数W(Z < 3) = nan;% plot only where the constraints are satisfiedsurf(X,Y,W,'linestyle','none');查看(68,20)保留onplot3(.4396,.0373,.8152,'o',“标记为彩色”,'r',...'MarkerSize',8);% best pointXlabel('x') ylabel('y') zlabel('z') holdoff
非线形制约は,c(x)<= 0
という形式で記述しなければなりません。matlabfunction
を使用,すべてシンボリックとその数をし,关数ハンドルハンドルに配置配置。。。
これら制约は,ベクトルにするするがあります,,各各列列列ががががががががつのつのつのつの制约关数の勾配勾配をようようような行列jacobian
によって生成される形式の転置行列であるため、以下では転置行列を求めます。
非线形制约关数ハンドル配置します。Fmincon
は、非線形制約と勾配が[c ceq gradc gradceq]
という顺序される想定します非线形制约が存在しないため,ceq
とGradceq
として[]
を出力し。
c1 = x1^4 - 5*sinh(x2/5); c2 = x2^2 - 5*tanh(x1/5) - 1; c = [c1 c2]; gradc = jacobian(c,x).';% transpose to put in correct form约束= matlabfunction(c,[],gradc,[],,,'vars',{X});
法アルゴリズム,ヘッセをを目的关数の一部别の关数としてとして记述记述记述记述するする必要がありあります。。これこれはは非线形非线形制约关数でで制约制约制约アルゴリズムの,关数のです。は,ガイドを参照してください。
ヘッセ関数には、2 つの入力引数を指定します。正のベクトルx
lambdaですです。非线形制约するするするする构造构造构造体の部分,,lambda.ineqnonlin
とlambda.eqnonlin
です。現在の制約の場合は、非線形等式が存在しないため、lambda.ineqnonlin(1)
とlambda.ineqnonlin (2)
という乗数を使用します。
1ののは目的关数の计算しました。ここででは,,,,,つのつのつの制约关数matlabfunction
で关数バージョンを作成。。
hessc1 = jacobian(gradc(:,1),x);%约束=第一C列hessc2 = jacobian(gradc(:,2),x); hessfh = matlabFunction(hessf,'vars',{X});hessc1h = matlabFunction(hessc1,'vars',{X});hessc2h = matlabfunction(hessc2,'vars',{X});
最終的なヘッシアンを作成するために、3 つのヘッシアンを統合し、適切なラグランジュ乗数を制約関数に追加します。
myhess = @(x,lambda)(hessfh(x) +...lambda.ineqnonlin(1)*hessc1h(x) +...lambda.ineqnonlin (2)*hessc2h(x));
内点法アルゴリズム、勾配、およびヘッシアンを使用するためのオプションを設定し、目的関数が目的と勾配の両方を返すようにした後、ソルバーを実行します。
选项= optimoptions('fmincon',...'算法',“内点”,...“指定目标gradient”,true,...'SpecifyConstraintGradient',true,...'HessianFcn',myhess,...'展示','最后');%fh2 =无黑森州的客观fh2 = matlabfunction(f,gradf,'vars',{X});[xfinal,fval,exitflag,output] = fmincon(fh2,[-1;2],...[],[],[],[],[],[],[],约束,选项)
当地最低限度发现满足约束。之所以完成优化,是因为目标函数在可行的方向,最优性公差值之内不折叠,并且在约束公差的值之内满足了约束。
xfinal =2×10.4396 0.0373
fval = 0.8152
exitflag = 1
output =struct with fields:iterations: 10 funcCount: 13 constrviolation: 0 stepsize: 1.9160e-06 algorithm: 'interior-point' firstorderopt: 1.9217e-08 cgiterations: 0 message: '...' bestfeasible: [1x1 struct]
この例でも、勾配とヘッシアンが与えられている場合の方がそうでない場合よりも、ソルバーによって反復と関数評価の回数が少なくなっています。
选项= optimoptions('fmincon','算法',“内点”,...'展示','最后');%fh3 =无梯度或黑森州的客观fh3 = matlabFunction(f,'vars',{X});没有梯度的百分比约束:constraint = matlabFunction(c,[],'vars',{X});[xfinal,fval,exitflag,output2] = fmincon(fh3,[-1; 2],,...[],[],[],[],[],[],[],约束,选项)
发现较低目标函数值的可行点。当地最低限度发现满足约束。之所以完成优化,是因为目标函数在可行的方向,最优性公差值之内不折叠,并且在约束公差的值之内满足了约束。
xfinal =2×10.4396 0.0373
fval = 0.8152
exitflag = 1
output2 =struct with fields:iterations: 18 funcCount: 57 constrviolation: 0 stepsize: 9.6632e-07 algorithm: 'interior-point' firstorderopt: 3.8435e-07 cgiterations: 0 message: '...' bestfeasible: [1x1 struct]
sprintf(['There were %d iterations using gradient'...“还有黑森州,但没有他们的%d。”],,...output.iterations,output2.iterations)
ans = 'There were 10 iterations using gradient and Hessian, but 18 without them.'
sprintf([“使用梯度进行%D功能评估”...“还有黑森州,但没有他们的%d。”],,...output.funcCount,output2.funcCount)
Ans ='使用梯度和Hessian进行了13个函数评估,但没有它们的57个功能。”
シンボリック変数のクリーンアップ
この例で使用したシンボリック変数は、実数であると想定されていました。この想定をシンボリック エンジン ワークスペースから取り除くには、これらの変数を削除するだけでは不十分です。次の構文を使用して、変数の仮定を消去しなければなりません。
assume([x1,x2],'clear')
次のコマンドの出力が空であるとき、すべての仮定が消去されます。
assumptions([x1,x2])
ans = Empty sym: 1-by-0