fcn2optimexpr
将函数转换为优化表达式
语法
描述
例子
将目标函数转换为表达式
若要在基于问题的方法中使用MATLAB™函数,而该函数不是由受支持的函数组成的,请首先将其转换为优化表达式。金宝app看到金宝app优化变量和表达式的支持操作而且将非线性函数转化为优化表达式.
使用目标函数γ
(数学函数
(阶乘函数的扩展),创建一个优化变量x
并在转换后的匿名函数中使用它。
X = optimvar(“x”);Obj = fcn2optimexpr(@gamma,x);问题=优化问题(“目标”、obj);显示(概率)
优化问题:求解:x最小化:gamma(x)
为了解决产生的问题,给出一个初始点结构和调用解决
.
x0。x=1/2; sol = solve(prob,x0)
使用fminunc解决问题。找到局部极小值。优化完成,因为梯度的大小小于最优性公差的值。
索尔=带字段的结构:x: 1.4616
对于更复杂的函数,转换函数文件。函数文件gammabrock.m
计算两个优化变量的目标。
类型gammabrock
函数f = gammabrock(x,y) f = (10*(y - gamma(x)))²+ (1 - x)²;
在问题中包含这个目标。
X = optimvar(“x”,下界的, 0);Y = optimvar(“y”);Obj = fcn2optimexpr(@gammabrock,x,y);问题=优化问题(“目标”、obj);显示(概率)
优化问题:解决:x, y最小化:gammabrock(x, y)变量界限:0 <= x
的gammabrock
函数是平方和。通过将函数表示为优化表达式的显式平方和,可以得到一个更有效的问题公式。
F = fcn2optimexpr(@(x,y)y - gamma(x),x,y);Obj2 = (10*f)^2 + (1-x)^2;Prob2 =优化问题(“目标”, methoda);
要看效率的差异,解决概率
而且prob2
并检查迭代次数的差异。
x0。x=1/2; x0.y = 1/2; [sol,fval,~,output] = solve(prob,x0);
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
[sol2,fval2,~,output2] = solve(prob2,x0);
使用lsqnonlin解决问题。找到局部极小值。优化完成,因为梯度的大小小于最优性公差的值。
流(' probb花费了%d次迭代,但prob2花费了%d次迭代\n'、output.iterations output2.iterations)
probb需要21次迭代,而prob2需要2次迭代
如果函数有多个输出,则可以将它们用作目标函数的元素。在这种情况下,u
是一个2乘2的变量,v
是2乘1的变量,和expfn3
有三个输出。
类型expfn3
函数[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;
创建适当大小的优化变量,并根据前两个输出创建一个目标函数。
U = optimvar(“u”2、2);V = optimvar(“v”2);[f,g,mineval] = fcn2optimexpr(@expfn3,u,v);Prob =优化问题;概率。目标= f*g/(1 + f^2);显示(概率)
优化问题:求解:u, v最小化:((arg2 .* arg3) ./ (1 + arg1.^2)) where: [arg1,~,~] = expfn3(u, v);[arg2,~,~] = expfn3(u, v);[~,arg3,~] = expfn3(u, v);
您可以使用mineval
在后续约束表达式中输出。
从函数创建非线性约束
在基于问题的优化中,约束是两个带有比较运算符(= =
,< =
,或> =
)。你可以使用fcn2optimexpr
创建一个或两个优化表达式。看到将非线性函数转化为优化表达式.
创建非线性约束gammafn2
小于等于-1/2。这个二元函数在gammafn2.m
文件。
类型gammafn2
函数f = gammafn2 (x, y) f =γ(x) * (y / (1 + y ^ 2));
创建优化变量,将函数文件转换为优化表达式,然后将约束表示为confn
.
X = optimvar(“x”,下界的, 0);Y = optimvar(“y”,下界的, 0);Expr1 = fcn2optimexpr(@gammafn2,x,y);Confn = expr1 <= -1/2;显示(confn)
Gammafn2 (x, y) <= -0.5
创建另一个约束条件gammafn2
大于或等于X + y
.
Confn2 = expr1 >= x + y;
创建一个优化问题,并在问题中放置约束条件。
Prob =优化问题;probo . constraints .confn = confn;prob.Constraints。Confn2 = Confn2;显示(概率)
优化问题:求解:x, y最小化:受制于confn: gammafn2(x, y) <= -0.5受制于confn: gammafn2(x, y) >= (x + y)变量边界:0 <= x 0 <= y
有效地计算共同目标和约束
如果您的问题涉及计算目标和非线性约束的常见且耗时的函数,则可以使用ReuseEvaluation
名称-值参数。的rosenbrocknorm
函数计算Rosenbrock目标函数和约束中使用的参数的范数
.
类型rosenbrocknorm
function [f,c] = rosenbrocknorm(x) pause(1) %模拟耗时函数c = dot(x,x);F = 100*(x(2) - x(1)²)²+ (1 - x(1))²;
创建一个二维优化变量x
.然后转换rosenbrocknorm
的优化表达式fcn2optimexpr
并设置ReuseEvaluation
参数的名称-值真正的
.为了确保fcn2optimexpr
使暂停
语句,设置分析
'的名称-值参数了”
.
X = optimvar(“x”2);[f,c] = fcn2optimexpr(@rosenbrocknorm,x,...“ReuseEvaluation”,真的,“分析”,“关闭”);
从返回的表达式创建目标表达式和约束表达式。在优化问题中包含目标表达式和约束表达式。使用以下方法回顾问题显示
.
问题=优化问题(“目标”f);probe . constraints .cineq = c <= 4;显示(概率)
优化问题:求解:x最小化:[argout,~] = rosenbrocknorm(x) subject to cineq: arg_LHS <= 4 where: [~,arg_LHS] = rosenbrocknorm(x);
从起点开始解决问题x0。x=[-1;1]
,计时结果。
x0。x=[-1;1]; tic [sol,fval,exitflag,output] = solve(prob,x0)
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。<停止条件详细信息>
索尔=带字段的结构:X: [2×1 double]
Fval = 4.5793e-11
exitflag = OptimalSolution
输出=带字段的结构:迭代:44 funcCount: 164 constrviolation: 0步长:4.3124e-08算法:'内部点' firstorderopt: 5.1691e-07 cgiterations: 10消息:'局部最小值发现满足约束。(()优化完成,因为目标函数在()可行方向上不下降,直到最优性公差的值之内,()且约束条件满足到约束公差的值之内。(() <停止条件详细信息>())(()优化完成:相对一阶最优性度量,5.169074e-07,()小于选项。OptimalityTolerance = 1.000000e-06,相对最大约束(违例)为0.000000e+00,小于选项。约束容忍= 1.000000e-06。' best可行:[1×1 struct] objectivederivative: "有限差分" constraintderivative: "有限差分"求解器:'fmincon'
toc
运行时间为165.623157秒。
以秒为单位的求解时间几乎与函数求值的次数相同。这一结果表明,求解器重用了函数值,并且没有浪费时间重新计算同一点两次。
有关更广泛的示例,请参见目标和约束具有串行或并行的共同功能,基于问题的.有关使用的更多信息fcn2optimexpr
,请参阅将非线性函数转化为优化表达式.
输入参数
fcn
- - - - - -转换函数
函数处理
要转换的函数,指定为函数句柄。
例子:@sin
指定正弦函数。
数据类型:function_handle
在
- - - - - -输入参数
MATLAB®变量
输入参数,指定为MATLAB变量。输入可以有任何数据类型和大小。您可以在输入参数中包含任何有问题的变量或数据在
;看到在基于问题的方法中传递额外的参数.
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
|逻辑
|字符
|字符串
|结构体
|表格
|细胞
|function_handle
|分类
|datetime
|持续时间
|calendarDuration
|fi
复数支持:金宝app是的
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里的名字
参数名称和价值
对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。
在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字
在报价。
例子:[out1,out2] = fcn2optimexpr(@fun,x,y,'OutputSize',[1,1],'ReuseEvaluation',true)
指定着干活
而且out2
是求解器将在目标函数和约束函数之间重用而无需重新计算的标量。
分析
- - - - - -功能分析指示
“上”
(默认)|“关闭”
指示分析功能fcn
要确定它是否完全由受支持的操作组成(请参阅金宝app金宝app优化变量和表达式的支持操作),指定为“上”
或“关闭”
.
如果你愿意
fcn2optimexpr
分析fcn
并且,如果可能的话,使用支持的操作来实现金宝appfcn
,指定“上”
.该规范使fcn
使用自动微分和选择适当的求解器,如解算器
.如果你不想要
fcn2optimexpr
分析fcn
因此,要治疗fcn
作为一个没有自动区分的黑盒,指定“关闭”
.在这种情况下,解决
只使用fmincon
,fminunc
,或lsqnonlin
作为求解器。
以了解更多关于分析
,请参阅限制.
例子:[out1,out2] = fcn2optimexpr(@fun,x,"Analysis","off")
数据类型:字符
|字符串
显示
- - - - - -报表功能分析细节
“关闭”
(默认)|“上”
报表功能分析详细信息,指定为“关闭”
(不报告)或“上”
(报告)。如果分析
是“关闭”
,没有什么可报告的。
例子:[out1,out2] = fcn2optimexpr(@fun,x,"Display","on")
数据类型:字符
|字符串
OutputSize
- - - - - -输出表达式的大小
整数向量|整数向量的单元格数组
输出表达式的大小,指定为:
整数向量-如果函数有一个输出
出
1,OutputSize
的大小。出
1.如果函数有多个输出出
1、……出
N,OutputSize
指定所有输出具有相同的大小。一个单元数组的整数向量-输出的大小
出
J是的第J个元素OutputSize
.
请注意
标量有大小[1]
.
如果没有指定“OutputSize”
名称-值对参数fcn2optimexpr
将数据传递给fcn
为了确定输出的大小(参见算法).通过指定“OutputSize”
,您启用fcn2optimexpr
跳过这一步,这样可以节省时间。此外,如果您没有指定“OutputSize”
以及对fcn
不管什么原因都失败了fcn2optimexpr
同样失败。
例子:[out1,out2,out3] = fcn2optimexpr(@fun,x,'OutputSize',[1,1])
指定三个输出[着干活,out2 out3]
是标量。
例子:[着干活,out2] = fcn2optimexpr (@fun x, OutputSize, {[4 4], [3,5]})
指定着干活
尺寸是4乘4和out2
大小为3乘5。
数据类型:双
|细胞
ReuseEvaluation
- - - - - -重用值的指示器
假
(默认)|真正的
用于重用值的指示器,指定为假
(请勿重复使用)或真正的
(重用)。
请注意
ReuseEvaluation
什么时候可能没有效果分析
=“上”
.
ReuseEvaluation
可以使您的问题运行得更快,例如,目标和一些非线性约束依赖于一个常见的计算。在这种情况下,求解器存储值以便在任何需要的地方重用,并避免重新计算值。
可重用值涉及一些开销,因此最好只对共享值的表达式启用可重用值。
例子:[out1,out2,out3] = fcn2optimexpr(@fun,x,"ReuseEvaluation",true,"Analysis","off")
允许着干活
,out2
,out3
用于多次计算,每个评估点只计算一次输出。
数据类型:逻辑
输出参数
出
-输出参数
OptimizationExpression
输出参数,返回为OptimizationExpression
.表达式的大小取决于输入函数。
限制
分析
可以忽略非计算函数吗
的
分析
算法可能不包括非计算函数。这方面的算法可以导致以下结果:暂停
语句会被忽略。不影响结果的全局变量可以忽略。例如,如果您使用全局变量来计算函数运行的次数,那么您可能会得到一个误导性的计数。
如果函数包含对
兰德
或rng
,该函数可能只执行第一次调用,并且以后的调用不设置随机数流。一个
情节
调用可能不会在所有迭代中更新图形。将数据保存到
垫
文件或文本文件可能不会在每次迭代中出现。
为确保非计算函数按预期操作,请设置
分析
参数的名称-值“关闭”
.
有关更多信息,请参见静态分析的局限性.
算法
分析
当分析
参数的默认设置为“上”
,fcn2optimexpr
执行几个步骤,试图创建最有效的优化表达式。中的算法描述fcn2optimexpr算法说明.
在问题对象中包含目标或非线性约束函数时,您有几种选择。
使用过载。如果函数中的所有操作都是金宝app优化变量和表达式的支持操作,可以直接在优化变量上调用函数。例如,
概率。目标= sin(3*x)*exp(-x-y);
使用
fcn2optimexpr
关于一个未修改的函数。如果函数中至少有一个操作不受支持,则必须调用金宝appfcn2optimexpr
.例如,besselh
函数不受支持,因此要将其包含在目金宝app标函数中,必须使用fcn2optimexpr
.概率。Objective = fcn2optimexpr(@(z)besselh(3,z),x);
修改一个函数,使其内部
为
循环出现在单独的函数中。这样做可以使静态分析加速循环。看到为静态分析创建for循环而且优化表达式的静态分析.设置
分析
参数“关闭”
在fcn2optimexpr
.这样做会导致fcn2optimexpr
将函数包裹在一个薄层中,这是一个快速的操作。得到的表达式不能利用自动微分(参见自动判别背景),因此可以导致求解器使用更多的函数求值来进行有限差分梯度估计。
输出的大小
在未指定时查找每个返回表达式的输出大小OutputSize
,fcn2optimexpr
为问题变量的每个元素在以下点处计算函数。
变量的特征 | 评估点 |
---|---|
有限上界乌兰巴托 有限下界磅 |
(lb + ub)/2 + ((ub - lb)/2)*eps |
有限的下界,没有上界 | Lb + max(1,abs(Lb))*eps |
有限的上界,没有下界 | Ub - max(1,abs(Ub))*eps |
是没有界限的 | 1 + eps |
变量指定为整数 | 地板上 前面给出的点 |
计算点可能导致函数计算中的错误。要避免此错误,请指定OutputSize
.
版本历史
在R2019a中引入
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。