主要内容

fcn2optimexpr

转换函数来优化表达式

自从R2019a

描述

例子

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

例子

(1,2……N] = fcn2optimexpr (fcn,1,2……K,名称,值)使用一个或多个指定附加选项名称-值对参数。例如,您可以保存一个函数评估通过OutputSize

例子

全部折叠

使用MATLAB™函数在具体问题具体分析的方法并不是由支持功能,首先将其转化为一个优化表达式。金宝app看到金宝app支持操作优化变量和表达式将非线性函数优化表达式

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

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

输入参数

全部折叠

转换函数,指定为一个函数处理。

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

数据类型:function_handle

输入参数,指定为一个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,“显示”,“上”)

数据类型:字符|字符串

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

  • 一个整数向量,如果函数有一个输出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可以让你跑得更快,当问题,例如,目标和一些非线性约束依赖于一个共同的计算。在这种情况下,解算器存储的值重用的地方需要和避免重新计算价值。

可重用的价值包括一些开销,所以最好使可重用的值只分享一个值的表达式。

例子:[着干活,out2 out3] = fcn2optimexpr (@fun x,“ReuseEvaluation”,的确,“分析”,“关闭”)允许着干活,out2,out3用于多个计算,输出每个评估点只被计算一次。

数据类型:逻辑

输出参数

全部折叠

输出参数,作为一个返回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