将非线性函数转化为优化表达式
本节演示如何选择是将非线性函数转换为优化表达式,还是通过对优化变量的支持操作创建表达式。本节还将展示如何在必要时使用fcn2optimexpr
.
尽可能使用支持的操作
通常,通过对优化变量和表达式使用支持的操作来创建目标或非线性约束函数。这样做的好处是解决
包括由自动微分计算的梯度。看到自动区分在基于问题优化中的作用.
一般来说,受支持的运算包括所有基本数学运算:加、减、乘、除、幂和初等函数,如指数函数和三角函数及其逆函数。非平滑操作如马克斯
,腹肌
,如果
,情况下
不受支持。有关完整的描述,请参见优化变量和表达式的支持操作.
例如,假设你的目标函数是
在哪里 是你提供的一个参数,问题是最小化 在 而且 .这个目标函数是平方和,在这一点取最小值为0 , .
目标函数是一个多项式,所以你可以把它写成优化变量的初等运算。
r = 2;x = optimvar (“x”);y = optimvar (“y”);F = 100*(y - x²)²+ (r - x)²;概率= optimproblem (“客观”f);x0。x=-1; x0.y = 2; [sol,fval] = solve(prob,x0)
使用lsqnonlin解决问题。局部最小值。由于梯度的大小小于最优公差值,因此优化已完成。
索尔=结构体字段:X: 2.0000 y: 4.0000
fval = 4.4373 e-31
通过转换目标函数来解决同样的问题fcn2optimexpr
,首先将目标写为匿名函数。
趣味性= @(x,y)100*(y - x^2)^2 + (r - x)^2;
将匿名函数转换为优化表达式。
概率。目标= fcn2optimexpr(有趣,x, y);[sol2, fval2] =解决(x0概率)
使用lsqnonlin解决问题。局部最小值。由于梯度的大小小于最优公差值,因此优化已完成。
sol2 =结构体字段:X: 2.0000 y: 4.0000
fval2 = 4.4373 e-31
解和以前一样。一般在R2022b或更高版本的软件中使用fcn2optimexpr
几乎不会降低性能,在某些情况下还会因为静态分析而提高性能。看到优化表达式的静态分析.
本示例的其余部分将展示关于使用的更多细节fcn2optimexpr
在目标函数或非线性约束的优化表达式中。
函数文件
要在基于问题的方法中使用包含不受支持的运算符的函数文件,必须将该文件转换为using的表达式fcn2optimexpr
.
例如,expfn3.m
文件包含以下代码:
类型expfn3.m
函数[f,g,mineval] = expfn3(u,v) mineval = min(eig(u));f = v ' * u * v;f = exp (f);t = u * v;G = t'*t + sum(t) - 3;
此函数不完全由受支持的操作组成,因为min (eig (u))
.因此,使用expfn3 (u, v)
作为优化表达式,您必须首先使用fcn2optimexpr
.
使用expfn3
作为优化表达式,首先创建适当大小的优化变量。
u = optimvar (“u”3, 3,下界的, 1“UpperBound”1);% 3 x3的变量v = optimvar (“v”3,下界的2,“UpperBound”2);% 3×1变量
将函数文件转换为优化表达式fcn2optimexpr
.
[f, g, mineval] = fcn2optimexpr (@expfn3, u, v);
方法指定表达式大小可以节省计算时间,因为所有返回的表达式都是标量的“OutputSize”
名称-值参数。另外,因为expfn3
方法计算所有输出,可以节省更多的计算时间ReuseEvaluation
名称-值参数。
[f, g, mineval] = fcn2optimexpr (@expfn3, u, v,“OutputSize”[1],“ReuseEvaluation”,真正的)
非线性优化表达式[argout,~,~] = expfn3(u, v)
g =非线性优化表达式[~,argout,~] = expfn3(u, v)
mineval =非线性优化表达式[~,~,argout] = expfn3(u, v)
匿名函数
若要在基于问题的方法中使用一般非线性函数句柄,请使用将句柄转换为优化表达式fcn2optimexpr
.例如,编写一个函数句柄相当于mineval
并把它。
有趣= @ (u)分钟(eig (u));funexpr = fcn2optimexpr(有趣,u,“OutputSize”[1])
funexpr =非线性优化表达式anonymousFunction1(u)其中:anonymousFunction1 = @(u)min(eig(u));
创建目标
要使用目标表达式作为目标函数,创建一个优化问题。
概率= optimproblem;概率。目标= f;
定义约束
定义约束g < = 0
在最优化问题中。
prob.Constraints。nlcon1 = g <= 0;
还要定义约束条件u
是对称的
.
probe . constraints .sym = u == u.';>= -1/2;
查看问题。
显示(概率)
优化问题:求解:u, v最小化:[argout,~,~] = expfn3(u, v) subject to nlcon1: arg_LHS <= 0 where: [~,arg_LHS,~] = expfn3(u, v);受信谊:u (2, 1) - u(1、2)= = 0 (3,1)- u(1、3)= = 0 - u (2, 1) + u(1、2)= = 0 (3 2)- u(2、3)= = 0 - u (3,1) + u(1、3)= = 0 - u (3 2) + u(2、3)= = 0 mineval主题:arg_LHS > =(-0.5)地点:[~,~,arg_LHS] = expfn3 (u, v);变量范围:1 < = u (1,1) < = 1 1 < = u (2, 1) < = 1 1 < = u (3,1) < = 1 1 < = u(1、2)< = 1 1 < = u (2, 2) < = 1 1 < = u (2) < = 1 1 < = u(1、3)< = 1 1 < = u(2、3)< = 1 1 < = u (3,3) < = 1 2 < = v (1) < = 2 2 < = v (2) < = 2 2 < = v (3) < = 2
解决问题
要解决这个问题,打电话解决
.设定起始点x0
.
rng默认的%的再现性x0。u=0.25*randn(3); x0.u = x0.u + x0.u.'; x0.v = 2*randn(3,1); [sol,fval,exitflag,output] = solve(prob,x0)
使用fmincon解决问题。找到目标函数值较低的可行点。找到了满足约束条件的局部极小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
索尔=结构体字段:U: [3x1 double] v: [3x1 double]
fval = -403.4288
exitflag = OptimalSolution
输出=结构体字段:迭代:98 funcCount: 1628 constrbreach: 4.2863e-12 stepsize: 1.2678e-04算法:' inner -point' firstorderopt: 0.0012 cgiterations: 186 message: '本地最小值发现,满足约束....' bestviable: [1x1 struct] objectivederivative: "finite-differences" constraintderivative: "finite-differences" solver: 'fmincon'
查看解决方案。
disp (sol.u)
0.5266 0.6613 -0.3653 0.6613 0.6935 0.5322 -0.3653 0.5322 0.3974
disp (sol.v)
2.0000 -2.0000 2.0000
解矩阵u
是对称的。所有的值v
都在边界上。
The MathWorks, Inc.版权所有