在MATLAB中不解决优化问题的Checkgradient

问题描述

我有一个相对复杂的函数,我已经计算了这个函数的雅可比的解析形式。然而,有时,我会弄乱这个雅可比行列式。

当使用 here 中描述的某些优化技术时,MATLAB 有一种很好的方法来检查雅可比矩阵的准确性。

问题是看起来 MATLAB 解决了优化问题,然后返回雅可比行列式是否正确。这非常耗时,尤其是考虑到我的一些优化问题需要数小时甚至数天的时间来计算。

Python 在 scipy 中有一个类似于 here 描述的函数,它只是将解析梯度与某些用户提供的输入的梯度的有限差分近似值进行比较。

我可以做些什么来检查 MATLAB 中雅可比矩阵的准确性,而无需解决整个优化问题?

解决方法

我用于此类事情的一种费力但有用的方法是检查声称的导数的(数值)积分是否是端点处函数的差异。我发现这比比较像 (f(x+h)-f(x))/h 和 f'(x) 这样的分数更方便,因为选择 h 很困难,一方面,h 不是那么小,以至于分数不受舍入误差的支配,另一方面 h 足够小,分数应该接近 f'(x)

在单个变量的函数 F 的情况下,假设您有代码 f 来评估 F 和 fd 说评估 F'。那么测试就是,对于不同的区间[a,b],看微积分基本定理说的应该是0的差异,

Integral{ 0<=x<=b | fd(x)} - (f(b)-f(a))

积分以数字方式计算。间隔不需要很小。 当然,部分误差是由于积分的数值近似误差造成的。出于这个原因,我倾向于使用,例如,订购 40 Gausss Legendre 积分器。

对于多个变量的函数,您可以一次测试一个变量。对于多个功能,可以一次测试一个。

我发现这些测试当然不是详尽无遗的,它们很容易显示出计算导数中出现的各种错误。

,

您是否考虑过使用复阶微分来检查您的梯度?见this description