主要内容

自动区分在基于问题优化中的作用

当使用自动微分时,以问题为基础解决函数通常需要较少的函数求值,并且可以更健壮地运行。

默认情况下,解决在适用的情况下,使用自动微分来评估目标函数和非线性约束函数的梯度。函数,自动微分适用于用优化变量的运算表示的函数fcn2optimexpr函数。看到优化工具箱中的自动区分而且将非线性函数转化为优化表达式

最小化问题

考虑以下目标函数的最小化问题:

f u n 1 1 0 0 x 2 - x 1 2 2 + 1 - x 1 2 f u n 2 经验值 - x - y 2 经验值 - 经验值 - y 1 年代 e c h y 2 o b j e c t v e f u n 1 - f u n 2

创建一个表示这些变量和目标函数表达式的优化问题。

概率= optimproblem;x = optimvar (“x”2);y = optimvar (“y”2);Fun1 = 100*(x(2) - x(1)²)²+ (1 - x(1))²;fun2 = exp(和((x - y) ^ 2)) * exp (exp (- y(1))) *双曲正割(y (2));概率。目标= fun1 - fun2;

最小化受非线性约束 x 1 2 + x 2 2 + y 1 2 + y 2 2 4

prob.Constraints.cons = (x和。^2 + y.^2) <= 4;

解决问题并检查解决过程

从起点开始解决问题。

init。x=[-1;2]; init.y = [1;-1]; [xproblem,fvalproblem,exitflagproblem,outputproblem] = solve(prob,init);
使用fmincon解决问题。找到了满足约束条件的局部极小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
disp (fvalproblem)
-0.5500
disp (outputproblem.funcCount)
77
disp (outputproblem.iterations)
46

输出结构表明,解决调用fmincon,这需要77次函数求值和46次迭代才能解决问题。目标函数在解处的值是fvalproblem = -0.55

不用自动微分就能解决问题

为了确定自动微分的效率增益,设置解决名称-值对参数使用有限差分梯度代替。

[xfd, fvalfd exitflagfd outputfd] =解决(概率,初始化,...“ObjectiveDerivative”有限差分的“ConstraintDerivative”有限差分的);
使用fmincon解决问题。找到了满足约束条件的局部极小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
disp (fvalfd)
-0.5500
disp (outputfd.funcCount)
270
disp (outputfd.iterations)
47

用有限差分梯度逼近引起解决进行269次函数评估,而不是77次。迭代的次数几乎相同,正如在解处报告的目标函数值一样。最终的解决点是相同的显示精度。

disp ([xproblem.x xproblem.y])
0.8671 1.0433 0.7505 0.5140
disp ([xfd.x xfd.y])
0.8671 1.0433 0.7505 0.5140

综上所述,自动微分在优化中的主要作用是减少函数求值的次数。

另请参阅

相关的话题

Baidu
map