fcn2optimexpr
语法
描述
例子
将目标函数转化为表达式
使用MATLAB™函数在具体问题具体分析的方法并不是由支持功能,首先将其转化为一个优化表达式。金宝app看到金宝app支持操作优化变量和表达式和将非线性函数优化表达式。
使用目标函数γ
(数学函数
阶乘函数的扩展),创建一个优化变量x
并使用它在一个匿名函数转换。
x = optimvar (“x”);obj = fcn2optimexpr (@gamma x);概率= optimproblem (“目标”、obj);显示(概率)
OptimizationProblem:解:x最小化:γ(x)
解决由此产生的问题,给一个初始点结构和调用解决
。
x0。x=1/2; sol = solve(prob,x0)
使用fminunc解决问题。局部最小值。优化完成因为梯度的大小小于最优值的宽容。
索尔=结构体字段:x: 1.4616
对于更复杂的函数,将一个函数文件。函数文件gammabrock.m
计算两个优化变量的客观。
类型gammabrock
函数f = gammabrock (x, y) f = (10 * (y -γ(x))) ^ 2 + (1 - x) ^ 2;
包括这一目标的一个问题。
x = optimvar (“x”,下界的,0);y = optimvar (“y”);obj = fcn2optimexpr (@gammabrock, x, y);概率= optimproblem (“目标”、obj);显示(概率)
OptimizationProblem:解:x, y最小化:gammabrock (x, y)变量范围:0 < = x
的gammabrock
函数是一个平方和。你得到一个更有效的表达问题公式化的函数作为优化表达式的一个显式的平方和。
f = fcn2optimexpr (@ (x, y) y -γ(x), x, y);methoda = (10 * f) ^ 2 + (1 - x) ^ 2;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解决问题。局部最小值。优化完成因为梯度的大小小于最优值的宽容。
流(的概率了% d迭代,但prob2 % d迭代\ n '、output.iterations output2.iterations)
概率花了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 + (t)和- 3;
创建适当大小的优化变量,并创建一个目标函数的两个输出。
u = optimvar (“u”2、2);v = optimvar (“v”2);[f, g, mineval] = fcn2optimexpr (@expfn3, u, v);概率= optimproblem;概率。目标= f * g / (1 + f ^ 2);显示(概率)
OptimizationProblem:解:u, v最小化:((最长*长度)。/ (1 + __arg1。^ 2))地点:[__arg1、~、~] = expfn3 (u, v);(最长,~,~)= expfn3 (u, v);(长度,~ ~)= 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;显示(概率)
OptimizationProblem:解:x, y最小化:主题confn: gammafn2 (x, y) < = -0.5主题confn2: gammafn2 (x, y) > = (x + y)变量范围:0 < < = y = x 0
计算有效地共同的目标和约束
如果你的问题涉及到一个共同的,耗时的函数来计算目标和非线性约束,你可以节省时间使用ReuseEvaluation
名称-值参数。的rosenbrocknorm
函数计算。目标函数和参数用于约束的规范
。
类型rosenbrocknorm
函数[f、c] = rosenbrocknorm (x)暂停(1)%模拟耗时的函数c =点(x, x);f = 100 * (x (2) - (1) ^ 2) ^ 2 + (1 - x (1)) ^ 2;
创建一个二维优化变量x
。然后转换rosenbrocknorm
通过使用一个优化表达式fcn2optimexpr
并设置ReuseEvaluation
名称-值参数真正的
。以确保fcn2optimexpr
使暂停
声明中,设置分析
名称-值参数的了”
。
x = optimvar (“x”2);[f、c] = fcn2optimexpr (@rosenbrocknorm x,…“ReuseEvaluation”,真的,“分析”,“关闭”);
从返回的表达式创建目标和约束表达式。包括目标和约束表达式的优化问题。审查问题使用显示
。
概率= optimproblem (“目标”f);prob.Constraints。cineq = c < = 4;显示(概率)
OptimizationProblem:解:x最小化:[argout ~] = rosenbrocknorm cineq (x)主题:arg_LHS < = 4所在:[~,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 constrviolation: 0 stepsize: 4.3124 e-08算法:“内点”firstorderopt: 5.1691 e-07 cgiterations: 10信息:局部最小值发现,满足约束。↵↵优化完成,因为目标函数中引入↵可行的方向,在最优值的宽容,↵和约束满足约束的值公差内。↵↵<停止标准细节>↵↵优化完成:相对一阶最优性措施,5.169074 e-07↵小于选项。OptimalityTolerance = 1.000000 e-06,相对最大约束↵违反,0.000000 e + 00,小于选项。ConstraintTolerance = 1.000000 e-06。“bestfeasible: [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之前,用逗号来分隔每一个名称和值,并附上的名字
在报价。
例子:[着干活,out2] = fcn2optimexpr (@fun, x, y,“OutputSize”, [1],“ReuseEvaluation”,真的)
指定着干活
和out2
标量解将重用目标和约束函数之间没有重新计算。
分析
- - - - - -信号分析功能
“上”
(默认)|“关闭”
信号分析功能fcn
来确定它是否完全由支持的操作(见金宝app金宝app支持操作优化变量和表达式),指定为“上”
或“关闭”
。
如果你想要
fcn2optimexpr
分析fcn
如果可能的话,使用支持的操作来实现金宝appfcn
,指定“上”
。这个规范使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
。的大小取决于输入函数表达式。
限制
分析
可以忽略Noncomputational功能
的
分析
算法可能不包括noncomputational功能。这方面的算法会导致以下:暂停
语句将被忽略。一个全局变量,可以忽略不影响结果。例如,如果您使用一个全局变量,例如,计算有多少次函数运行时,那么你可能会获得一个误导。
如果函数包含调用
兰德
或rng
,第一次调用的函数会执行,和未来的调用并不设置随机数流。一个
情节
电话可能根本就不更新图迭代。保存数据到一个
垫
文件或文本文件可能不会发生在每一个迭代。
以确保noncomputational功能像您预期的那样运行,设置
分析
名称-值参数“关闭”
。
有关更多信息,请参见静态分析的局限性。
算法
分析
当分析
参数的默认设置“上”
,fcn2optimexpr
执行几个步骤,以创建最有效的优化表达式。看到的算法描述fcn2optimexpr算法描述。
你有几个选择包括客观或非线性约束函数对象的问题。
使用过载。如果所有操作在一个函数中金宝app支持操作优化变量和表达式,你可以直接调用的函数优化变量。例如,
概率。目标=罪(3 * x) * exp (xy);
使用
fcn2optimexpr
在未经修改的功能。如果至少有一个操作在一个函数中不支持,您必须调用金宝appfcn2optimexpr
。例如,besselh
功能不支持,所以将它纳入一个目标金宝app函数,您必须使用fcn2optimexpr
。概率。目标= fcn2optimexpr (@ (z) besselh (z), x);
修改一个函数,使其内部
为
循环出现在单独的功能。这样做使静态分析能够加速循环。看到创建静态分析的for循环和静态分析的优化表达式。设置
分析
参数“关闭”
在fcn2optimexpr
。这样做的原因fcn2optimexpr
将函数作为一个黑盒,这是一个快速操作。得到的表达式不能利用自动分化(见自动分化背景),所以导致解算器可以使用更多的有限差分梯度估计函数的评估。
输出的大小
找到每个表达式返回的输出尺寸当你没有指定OutputSize
,fcn2optimexpr
评估每个元素的函数在以下点问题的变量。
变量的特征 | 评估点 |
---|---|
有限的上界乌兰巴托 和有限的下界磅 |
(磅+乌兰巴托)/ 2 +((乌兰巴托-磅)/ 2)*每股收益 |
有限的下界和上界 | 磅+马克斯(1、abs(磅))*每股收益 |
有限的上界和下界 | 乌兰巴托- max (1、abs(乌兰巴托))*每股收益 |
是没有界限的 | 1 +每股收益 |
变量指定为一个整数 | 地板上 鉴于之前的点 |
功能的评估点可能会导致一个错误的评估。为了避免这种错误,指定OutputSize
。
版本历史
介绍了R2019a
MATLAB命令
你点击一个链接对应MATLAB命令:
运行该命令通过输入MATLAB命令窗口。Web浏览器不支持MATLAB命令。金宝app
你也可以从下面的列表中选择一个网站:
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。