用符号数学优化工具箱解决者
这个例子展示了如何使用符号数学工具箱™函数雅可比矩阵
和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的梯度和黑森:
gradf =雅可比矩阵(f (x)。%列gradf
gradf =
hessf =雅可比矩阵(gradf, x)
hessf =
的fminunc
解算器预计传入一个向量x,,SpecifyObjectiveGradient
选项设置为真正的
和HessianFcn
选项设置为“目标”
预计,一组三个输出:(f (x), gradf (x) hessf (x))
。
matlabFunction
生成这个列表的三个输出从三个输入列表中。此外,使用var
选项,matlabFunction
接受向量输入。
跳频= matlabFunction (f, gradf hessf,“var”,{x});
现在解决最小化问题开始在[1、2]:
选择= optimoptions (“fminunc”,…“SpecifyObjectiveGradient”,真的,…“HessianFcn”,“目标”,…“算法”,“信赖域”,…“显示”,“最后一次”);[xfinal, fval exitflag、输出]= fminunc (fh、[1, 2]选项)
局部最小值。fminunc停止是因为最后的函数值的变化相对于其初始值小于公差的值函数。
xfinal =2×11.3333 - 1.0370
fval = 7.6623 e-12
exitflag = 3
输出=结构体字段:迭代:14 funcCount: 15 stepsize: 0.0027 cgiterations: 11 firstorderopt: 3.4391 e-05算法:“信赖域”的信息:“局部最小值可能....“constrviolation: []
比较这个和使用没有梯度的迭代次数或黑森信息。这需要“拟牛顿”
算法。
选择= optimoptions (“fminunc”,“显示”,“最后一次”,“算法”,“拟牛顿”);fh2中= matlabFunction (f,“var”,{x});% fh2中=目标没有梯度和黑森[xfinal, fval exitflag output2] = fminunc (fh2中,[1,2]选项)
局部最小值。优化完成因为梯度的大小小于最优值的宽容。
xfinal =2×11.3333 - 1.0371
fval = 2.1985 e-11
exitflag = 1
output2 =结构体字段:迭代:18 funcCount: 81 stepsize: 2.1164 e-04 lssteplength: 1 firstorderopt: 2.4587 e-06算法:“拟牛顿”的信息:“局部最小值发现....”
当使用低梯度的迭代次数和麻布,还有大幅减少功能评估:
sprintf ([有% d使用梯度迭代的…和黑森,但% d。”),…output.iterations output2.iterations)
ans = '有14个迭代使用梯度和黑森,但18。
sprintf ([有% d函数评估使用梯度的…和黑森,但% d。”),…output.funcCount output2.funcCount)
ans = '有15个函数评估使用梯度和黑森,但81年。”
第二个例子:约束最小化使用fmincon内点算法
我们认为相同的目标函数和起点,但现在有两个非线性约束:
约束保持优化的全局最小值点[1.333,1.037]。想象两个约束条件:
(X, Y) = meshgrid (2: .01:3);Z = (5 * sinh (y / 5) > = x ^ 4);% Z = 1,第一个约束是满意,否则Z = 0Z = Z + 2 *(5 *双曲正切(x / 5) > = Y。^ 2 - 1);% Z = 2,第二个是满意,Z = 3都在哪里冲浪(X, Y, Z,“线型”,“没有”);无花果= gcf;fig.Color =' w ';%白色背景视图(0,90)在plot3 (。4396, .0373, 4,“o”,“MarkerEdgeColor”,“r”,“MarkerSize”8);%最佳点包含(“x”)ylabel (“y”)举行从
我们绘制一个小红圈的最佳点。
这是一个阴谋的目标函数的可行区域,满足这两个约束条件的地区,如上图所示在深红色,和小红圈最优点:
W =日志(1 + 3 * (Y - (X。^ 3 - X))。^ 2 + (X - 4/3) ^ 2);% W =目标函数W (Z < 3) =南;%只在满足约束条件的阴谋冲浪(X, Y, W,“线型”,“没有”);视图(68年,20)在plot3 (。4396, .0373, .8152,“o”,“MarkerEdgeColor”,“r”,…“MarkerSize”8);%最佳点包含(“x”)ylabel (“y”)zlabel (“z”)举行从
必须写在非线性约束形式c (x) < = 0
。我们计算符号约束及其衍生物,并将其设置为一个函数处理使用matlabFunction
。
应该列向量的梯度约束;他们必须放置在目标函数为一个矩阵,矩阵的每一列代表一个约束函数的梯度。这是生成的表单的转置雅可比矩阵
,所以我们把下面的转置。
我们把非线性约束函数句柄。fmincon
预计的非线性约束和梯度的顺序输出[c量表gradc gradceq]
。由于没有非线性等式约束,我们输出[]
为量表信
和gradceq
。
c1 = x1 ^ 4 - 5 * sinh (x2/5);c2 = x2 ^ 2 - 5 *双曲正切(x1/5) - 1;c = (c1, c2);gradc =雅可比矩阵(c、x) ';%的转置正确形式约束= matlabFunction (gradc, c, [] [],“var”,{x});
内点算法需要写它的黑森功能作为一个独立的函数,而不是目标函数的一部分。这是因为一个非线性约束函数需要包含这些约束的麻绳。它的黑森的黑森拉格朗日;有关更多信息,请参见用户手册。
黑森函数需要两个输入参数:位置向量x
λ,拉格朗日乘子结构。λ的部分结构,使用非线性约束lambda.ineqnonlin
和lambda.eqnonlin
。对当前约束,没有线性等式,我们使用两个乘数lambda.ineqnonlin (1)
和lambda.ineqnonlin (2)
。
我们计算了黑森目标函数的第一个例子。现在我们计算两个约束函数的麻布,并使函数处理版本matlabFunction
。
hessc1 =雅可比矩阵(gradc (: 1), x);%约束c =第一列hessc2 =雅可比矩阵(gradc (:, 2), x);hessfh = matlabFunction (hessf,“var”,{x});hessc1h = matlabFunction (hessc1,“var”,{x});hessc2h = matlabFunction (hessc2,“var”,{x});
最后的麻绳,我们一起把三个麻布,添加适当的约束函数拉格朗日乘数法。
myhess = @ (x,λ)(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、输出]= fmincon (fh2中,[1,2],…[],[]、[][],[][],约束,选项)
局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
xfinal =2×10.4396 - 0.0373
fval = 0.8152
exitflag = 1
输出=结构体字段:迭代:10 funcCount: 13 constrviolation: 0 stepsize: 1.9160 e-06算法:“内点”firstorderopt: 1.9217 e-08 cgiterations: 0消息:“局部最小值发现满足约束....“bestfeasible (1 x1结构):
少,解算器让许多迭代和功能评估与梯度和黑森比当他们不提供:
选择= optimoptions (“fmincon”,“算法”,“内点”,…“显示”,“最后一次”);% fh3 =目标没有梯度和黑森fh3 = matlabFunction (f,“var”,{x});%不梯度约束:约束= matlabFunction (c []“var”,{x});[xfinal, fval exitflag output2] = fmincon (fh3 [1, 2],…[],[]、[][],[][],约束,选项)
目标函数值较低的可行点。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
xfinal =2×10.4396 - 0.0373
fval = 0.8152
exitflag = 1
output2 =结构体字段:迭代:18 funcCount: 57 constrviolation: 0 stepsize: 9.6632 e-07算法:“内点”firstorderopt: 3.8435 e-07 cgiterations: 0消息:“局部最小值发现满足约束....“bestfeasible (1 x1结构):
sprintf ([有% d使用梯度迭代的…和黑森,但% d。”),…output.iterations output2.iterations)
ans = '有10个迭代使用梯度和黑森,但18。
sprintf ([有% d函数评估使用梯度的…和黑森,但% d。”),…output.funcCount output2.funcCount)
ans = '有13个功能评估使用梯度和黑森,但没有他们57。
清理符号变量
在这个例子中使用的符号变量被认为是真实的。清除这个假设的象征性的引擎工作空间,删除变量是不够的。你必须明确的假设变量使用语法
假设((x1, x2),“清楚”)
所有的假设都是清除时,下面的命令的输出是空的
假设((x1, x2))
ans =空信谊:1-by-0