在MATLAB中检查梯度而不解决优化问题



我有一个相对复杂的函数,我已经计算出了这个函数的雅可比函数的解析形式。然而,有时,我会把这个雅各宾派搞砸。

当使用这里描述的一些优化技术时,MATLAB有一种很好的方法来检查Jacobian的准确性。

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

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

在不必解决整个优化问题的情况下,我能做些什么来检查MATLAB中Jacobian的准确性吗?

我在这类事情上使用的一种费力但有用的方法是检查所谓导数的(数值(积分是否是函数在端点处的差。我发现这比比较像(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高斯-勒让德积分器。

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

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

您是否考虑过使用复数阶差来检查梯度?参见本说明

最新更新