非线性函数的数值微分

计算科学 有限差分 准确性
2021-12-19 10:15:19

在我为计算编写代码的过程中,我遇到了一个问题,即在网格上的不同点对非线性函数进行数值微分。我使用简单的前向有限差​​分法来区分函数,但是当我知道计算的解析解时,误差很大。

所以为了更好地理解我数字区分的问题f(x)=1/x因为已知解析解是f(x)/=1/x2. 所以我试图计算数值和解析导数之间的误差f(x)并针对不同的值绘制误差与步长的关系x. 结果作为图片附加(两个轴都是对数的!)。

从图中可以看出,对于 stepsize 的最小值,错误是显着事件,当x是小。现在这对我来说很有意义,因为随着函数的减小,直线逼近会变得越来越非线性x.

所以我的问题是,除了有限差分法之外,有没有更好的方法在函数域上对非线性函数进行数值微分?我需要数值区分的函数是多变量函数,但该方法可以很容易地从单变量函数扩展到我想的多变量函数。

2个回答

您在导数中缺少减号,f(x)=1x2.

第一次订购的错误h

f(x+h)f(x)hf(x)hx3
据我所知,这与您的数据相符。如果x很小,对于固定而言,这可能是一个非常大的数字h. 因此,您的问题纯粹是数学问题,而不是由于您的实现错误或数值舍入问题。

问题当然是f(x)发散为x0.

您可以通过以下方式处理此类问题(建议不限于您的具体情况1/x或数值微分,但通常是在数值上处理“丑陋”且表现不佳的函数):

  • 将函数转换为更好看的函数(没有分歧等);在这种特定情况下,您可以乘以x要得到g(x)=f(x)x, 区分g(x)数字并使用它f(x)=(g(x)f(x))/x. 另一种可能的变换可能是,如果你正在处理一个复杂的函数 g(x),你知道它的渐近行为x=0像是1/x(或您可以分析处理的任何其他简单函数),您可以改为使用不具有奇点的 g(x) - 1/x。

要么

  • 选择一个足够小的h,也许是自适应的(越接近分歧越小);最终,如果您太接近 0,您将遇到精度或舍入问题,因此仅此方法不会让您一直走到奇点,但如果您对远离奇点的值感到满意,它就足够了。

要么

  • 如果这是一个现实世界的问题(来自物理学,......),请从那个角度分析它。通常情况下,现实世界中的事情不会无穷无尽,因此您处理的数量可能不是分析的正确数量。

要么

  • 如果这是函数的一部分,也许另一部分取消了这个奇点!?

要么

  • 看看是否用变换移动奇点xx0x或类似的帮助。

要么

  • 查看其他数值方法是否更适合您的任务。(例如,在您的情况下,您可以尝试中心差异而不是前向差异)。

这个问题的答案取决于你真正对区分哪种功能感兴趣。也就是说,我将在这里给出一个基本的、一般的答案。

正如已经指出的,您正在使用有限差分公式

f(x)f(x+h)f(x)h.

精确到一阶(即误差与h)。有两种简单的方法可以提高准确性。如您所知,第一个是减少h. 唯一的问题是对于非常小的h,舍入误差会变得很大(您的绘图中没有接近如此小的值)。获得更准确近似值的另一种一般方法是使用具有更高精度的公式。例如,居中的公式

f(x)f(x+h)f(xh)2h

精确到二阶(即误差与h2)。为了更好地理解导数的有限差分近似及其准确性,请阅读任何介绍性数值分析书籍,甚至只是Wikipedia我特别喜欢LeVeque 文本的第一章。