MATLAB 中的 fmincon 如何计算梯度?

计算科学 优化 matlab 约束优化 数字
2021-12-15 15:48:23

我试图在 MATLAB 中以数值方式解决一个受约束的优化问题,我想知道fmincon当没有提供梯度时该函数如何计算梯度。这里有谁知道,或者知道我怎么能找到?

运行优化问题所花费的时间比我想要的要多,所以我希望通过分析提供梯度来加速它。然而,当我这样做时,我最终得到了截然不同的解决方案,与 MATLAB 在我不提供渐变时生成的解决方案相比,这些解决方案似乎不太合理。

作为检查,我使用CheckGradientsfmincon. 可以预见的是,我提供的梯度没有通过这个测试。即使我设置FiniteDifferenceType'central'. 一个明显的解释是我提供的导数确实是不正确的。但是,我已经检查了好几次,我很确定它们不是。

作为一个健全的检查,我试图用数值计算我的目标的梯度,gradient文档建议使用有限差分计算。不幸的是, 的输出与计算gradient梯度相差甚远fmincon

我真的不确定发生了什么,如果有人可以帮助阐明这种情况,我将不胜感激。

编辑:我对为什么产生不同的数值导数更感兴趣fmincongradient尽管表面上两者都是使用有限差分计算的。除非我误解了这些选项,否则即使我给它们相同的有限差分步长,差异仍然存在。


此外,如果它是相关的:

我实际上正在使用GlobalSearch(然后调用fmincon)来解决形式的约束优化问题

maxp,qV(p,q)C(p,q)  s.t.i=1npi=1i=1nqi=1.

V(p,q)实际上是一些线性规划问题的值函数,我编写了一个脚本来调用linprog来计算我的目标值。也线性地进入该问题的目标和约束。是非线性的。(p,q)C

1个回答

fmincon 文档非常清楚它如何计算梯度具体来说,FiniteDifferenceTypeFiniteDifferenceStepSize选项的文档对此进行了一些详细的解释。fmincon正在使用前向(默认)或中心差分公式,并根据文档选择步长FiniteDifferenceStepSize

所以相关的问题不是它们是如何计算的,而是为什么通过有限差分计算的梯度与从解析表达式计算的梯度差异如此之大?通常这是由于有限差分步长对于数值“微分”的函数而言太大或太小造成的。步长过大的问题是显而易见的。步长过小的问题是舍入误差使计算不可靠。通常需要一些不同步长的实验来找到适合特定函数的值。

Iott 和 Haftka在本文中更详细地解释了这 一点,他们讨论了一种步长选择方法。