首页 > 解决方案 > 计算匿名函数的二阶导数

问题描述

我想在 Matlab 中计算匿名函数的二阶导数。我已经知道一些公式(数值微分),但它们似乎不起作用。

我可以计算一阶导数:

f = @(x) (x^3);
h = 1e-10;

df = @(x) (f(x+h) - f(x))/h;

但是当我尝试使用以下方法计算二阶导数时,我没有得到预期的结果:

f = @(x) (x^3);
h = 1e-10;

d2f = @(x) (f(x+h) - 2*f(x) + f(x-h))/(h^2);

对于 d2f,我应该得到一个类似于 d2f = 6x 的函数,但是如果绘制 d2f,我会得到这个: plot d2f

我做错了什么?

标签: matlabnumerical-methodsdifferentiation

解决方案


分差公式的理论误差为O(h^2)。函数的浮点计算将各自产生一个机器精度μ左右的相对误差。然后除以 h^2。两个误差的最佳总和是在它们达到平衡的地方,即 h^4=mu 或 h=1e-4 的地方。

如果作为 f 的四阶导数的误差项的系数为零,这当然是无效的,因为它发生在 f(x)=x^3 时。那么唯一的误差贡献是浮点误差,对于较大的 h 最小,即使 h=1 也会产生最小的误差。

对于像 f(x)=sin(x) 这样不那么简单的函数,不同 h 的误差表现如下图所示(其中标记为 x 的变量是步长 h)

在此处输入图像描述


推荐阅读