主要内容

将非线性函数转化为优化表达式

本节展示如何选择是将非线性函数转换为优化表达式,还是通过对优化变量的支持操作创建表达式。金宝app本节还展示了如何转换函数,如果需要的话,使用fcn2optimexpr

尽可能使金宝app用支持的操作

通常,通过对优化变量和表达式使用受支持的操作来创建目标或非线性约束函数。金宝app这样做的好处是解决包括自动分化计算梯度。看到自动微分在基于问题的优化中的作用

一般来说,支持的运算包括金宝app所有基本的数学运算:加、减、乘、除、幂,以及初等函数,如指数函数和三角函数及其逆。非平滑操作,如马克斯腹肌如果,情况下不支持。金宝app有关完整描述,请参见金宝app优化变量和表达式的支持操作

例如,假设你的目标函数是

f x y r 1 0 0 y - x 2 2 + r - x 2

在哪里 r 是你提供的参数,问题是最小化 f x 而且 y .这个目标函数是一个平方和,并且取该点的最小值为0 x r y r 2

目标函数是一个多项式,所以你可以把它写成关于优化变量的初等运算。

R = 2;X = optimvar(“x”);Y = optimvar(“y”);F = 100*(y - x²)²+ (r - x)²;问题=优化问题(“客观”f);x0。x=-1; x0.y = 2; [sol,fval] = solve(prob,x0)
使用lsqnonlin解决问题。找到局部极小值。优化完成,因为梯度的大小小于最优性公差的值。
索尔=带字段的结构:X: 2.0000 y: 4.0000
Fval = 4.4373e-31

通过转换目标函数来解决同样的问题fcn2optimexpr,首先将目标写成匿名函数。

Fun = @(x,y)100*(y - x^2)^2 + (r - x)^2;

将匿名函数转换为优化表达式。

概率。Objective = fcn2optimexpr(fun,x,y);[sol2,fval2] = solve(prob,x0)
使用lsqnonlin解决问题。找到局部极小值。优化完成,因为梯度的大小小于最优性公差的值。
sol2 =带字段的结构:X: 2.0000 y: 4.0000
Fval2 = 4.4373e-31

解和以前一样。一般在R2022b或更高版本的软件中使用fcn2optimexpr由于静态分析,几乎不会降低性能,在某些情况下还会提高性能。看到优化表达式的静态分析

本例的其余部分将展示有关使用的更多细节fcn2optimexpr在目标函数或非线性约束的优化表达式中。

函数文件

要在基于问题的方法中使用包含不受支持的操作符的函数文件,必须将该文件转换金宝app为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;

此函数不完全由受支持的操作组成,因为金宝appmin (eig (u)).因此,使用expfn3 (u, v)作为优化表达式,必须首先使用fcn2optimexpr

使用expfn3作为优化表达式,首先创建适当大小的优化变量。

U = optimvar(“u”3, 3,下界的, 1“UpperBound”1);% 3乘3变量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”,真正的)
f =非线性优化表达式[argout,~,~] = expfn3(u, v)
g =非线性优化表达式[~,argout,~] = expfn3(u, v)
mineval =非线性优化表达式[~,~,argout] = expfn3(u, v)

匿名函数

若要在基于问题的方法中使用一般非线性函数句柄,请使用将句柄转换为优化表达式fcn2optimexpr.例如,写一个函数句柄等价于mineval然后转换。

Fun = @(u)min(eig(u));Funexpr = fcn2optimexpr(fun,u,“OutputSize”[1])
funexpr =非线性优化表达式anonymousFunction1(u)其中:anonymousFunction1 = @(u)min(eig(u));

创建目标

要将目标表达式用作目标函数,请创建一个优化问题。

Prob =优化问题;概率。目标= f;

定义约束

定义约束G <= 0在优化问题中。

prob.Constraints。nlcon1 = g <= 0;

还要定义约束条件u是对称的 n e v 一个 l - 1 / 2

probo . constraints .sym = u == u.';probo . constraints .mineval = mineval >= -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: [3x3 double] v: [3x1 double]
Fval = -403.4288
exitflag = OptimalSolution
输出=带字段的结构:迭代:98 funcCount: 1628 constrviolation: 4.2863e-12 stepsize: 1.2678e-04 algorithm: ' internal -point' firstorderopt: 0.0012 cgiterations: 186 message: '局部最小值发现满足约束....' bestviable: [1x1 struct] objectivederivative: " limited -differences" constraintderivative: " limited -differences"

查看解决方案。

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

解矩阵u是对称的。的所有值v都在边界上。

版权所有The MathWorks, Inc.

另请参阅

|

相关的话题