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