主要内容

fcn2optimexpr

将函数转换为优化表达式

描述

例子

1,2……N] = fcn2optimexpr(fcn1,2……K)转换函数fcn (in1, in2,…,墨水)的优化表达式N输出。

例子

1,2……N] = fcn2optimexpr(fcn1,2……K,名称,值使用一个或多个名称-值对参数指定其他选项。例如,您可以通过传递保存函数求值OutputSize

例子

全部折叠

若要在基于问题的方法中使用MATLAB™函数,而该函数不是由受支持的函数组成的,请首先将其转换为优化表达式。金宝app看到金宝app优化变量和表达式的支持操作而且将非线性函数转化为优化表达式

使用目标函数γ(数学函数 Γ x (阶乘函数的扩展),创建一个优化变量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目标函数和约束中使用的参数的范数 x 2 4

类型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,请参阅将非线性函数转化为优化表达式

输入参数

全部折叠

要转换的函数,指定为函数句柄。

例子:@sin指定正弦函数。

数据类型:function_handle

输入参数,指定为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作为一个没有自动区分的黑盒,指定“关闭”.在这种情况下,解决只使用fminconfminunc,或lsqnonlin作为求解器。

以了解更多关于分析,请参阅限制

例子:[out1,out2] = fcn2optimexpr(@fun,x,"Analysis","off")

数据类型:字符|字符串

报表功能分析详细信息,指定为“关闭”(不报告)或“上”(报告)。如果分析“关闭”,没有什么可报告的。

例子:[out1,out2] = fcn2optimexpr(@fun,x,"Display","on")

数据类型:字符|字符串

输出表达式的大小,指定为:

  • 整数向量-如果函数有一个输出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可以使您的问题运行得更快,例如,目标和一些非线性约束依赖于一个常见的计算。在这种情况下,求解器存储值以便在任何需要的地方重用,并避免重新计算值。

可重用值涉及一些开销,因此最好只对共享值的表达式启用可重用值。

例子:[out1,out2,out3] = fcn2optimexpr(@fun,x,"ReuseEvaluation",true,"Analysis","off")允许着干活out2,out3用于多次计算,每个评估点只计算一次输出。

数据类型:逻辑

输出参数

全部折叠

输出参数,返回为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将函数包裹在一个薄层中,这是一个快速的操作。得到的表达式不能利用自动微分(参见自动判别背景),因此可以导致求解器使用更多的函数求值来进行有限差分梯度估计。

输出的大小

在未指定时查找每个返回表达式的输出大小OutputSizefcn2optimexpr为问题变量的每个元素在以下点处计算函数。

变量的特征 评估点
有限上界乌兰巴托有限下界 (lb + ub)/2 + ((ub - lb)/2)*eps
有限的下界,没有上界 Lb + max(1,abs(Lb))*eps
有限的上界,没有下界 Ub - max(1,abs(Ub))*eps
是没有界限的 1 + eps
变量指定为整数 地板上前面给出的点

计算点可能导致函数计算中的错误。要避免此错误,请指定OutputSize

版本历史

在R2019a中引入