主要内容

将非线性函数优化表达式

本节展示了如何选择是否转换的非线性函数优化表达式或创建表达式支持优化变量的操作。金宝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 ^ 2) ^ 2 + (r - x) ^ 2;概率= optimproblem (“客观”f);x0。x=- - - - - -1; x0.y = 2; [sol,fval] = solve(prob,x0)
使用lsqnonlin解决问题。局部最小值。优化完成因为梯度的大小小于最优值的宽容。
索尔=结构体字段:x: 2.0000 y: 4.0000
fval = 8.0661 e-29

解决同样的问题,将目标函数使用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 = 8.0661 e-29

解决方案是一样的。一般来说,软件版本R2022b或后,使用fcn2optimexpr给没有性能降低,在某些情况下提供改进的性能,因为静态分析。看到静态分析的优化表达式

余下的这个例子展示了更多细节关于使用fcn2optimexpr在优化一个目标函数的表达式或非线性约束。

函数文件

使用一个函数文件包含不受支持的运营商的具体问题具体分析的方法,你必须将文金宝app件转换为一个表达式使用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 + (t)和- 3;

这个函数并不完全由因为支持的操作金宝appmin (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”,真正的)
f =非线性OptimizationExpression [argout, ~, ~] = expfn3 (u, v)
g =非线性OptimizationExpression [argout, ~ ~] = expfn3 (u, v)
非线性OptimizationExpression mineval = [~, ~, argout] = expfn3 (u, v)

匿名函数

使用一个通用的非线性函数处理的具体问题具体分析的方法,将处理一个优化表达式使用fcn2optimexpr。例如,编写一个函数处理相当于mineval并把它。

有趣= @ (u)分钟(eig (u));funexpr = fcn2optimexpr(有趣,u,“OutputSize”[1])
funexpr =非线性OptimizationExpression anonymousFunction1 (u)地点:anonymousFunction1 = @ (u)分钟(eig (u));

创建目标

使用客观的表达式作为目标函数,建立一个优化问题。

概率= optimproblem;概率。目标= f;

定义约束

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

prob.Constraints。nlcons1 = g < = 0;

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

prob.Constraints。信谊= u = = u。';prob.Constraints。mineval=mineval>= -1/2;

查看问题。

显示(概率)
OptimizationProblem:解:u, v最小化:[argout, ~, ~] = expfn3 nlcons1 (u, v)主题:arg_LHS < = 0地点:[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 (3 x3双):v: [3 x1双)
fval = -403.4288
exitflag = OptimalSolution
输出=结构体字段:迭代:77 funcCount: 1149 constrviolation: 0 stepsize: 4.7493 e-05算法:“内点”firstorderopt: 5.2847 e-04 cgiterations: 99信息:局部最小值发现,满足约束....“bestfeasible: [1 x1 struct] objectivederivative:“有限差分”constraintderivative:“有限差分求解”:“fmincon”

查看解决方案。

disp (sol.u)
0.7074 0.5873 -0.6201 0.5873 0.6271 0.5399 -0.6201 0.5399 0.6600
disp (sol.v)
2.0000 -2.0000 2.0000

解矩阵u是对称的。所有的值v在范围内。

版权2018 - 2022 MathWorks公司。

另请参阅

|

相关的话题