计算匿名函数的二阶导数

时间:2019-04-10 15:01:02

标签: matlab numerical-methods differentiation

我想计算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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

除差公式的理论误差为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)

enter image description here

答案 1 :(得分:0)

我不确定您的操作不正确,但是下面的代码有效

f=@(x) x.^3;

x = (0:1E-12:1E-6)' ;
d2y = secondDerivative(f,x(1),x(end),x(2)-x(1))';

fit(x,d2y,'poly1')

ans = 

     Linear model Poly1:
     ans(x) = p1*x + p2
     Coefficients (with 95% confidence bounds):
       p1 =           6  (6, 6)
       p2 =   1.352e-15  (-4.734e-13, 4.761e-13)

函数定义

function d2y = secondDerivative(f, x1, x2, dx)

y = f(x1:dx:x2);

d2y = nan(size(y));
d2y(2:end-1) = y(1:end-2) - 2*y(2:end-1) + y(3:end);

if length(d2y) == 3
    d2y(1) = y(1) - 2*y(2) + y(3);
    d2y(2) = y(end-2) - 2*y(end-1) + y(end);
elseif length(d2y) > 4
    d2y(1) = 2*y(1) - 5*y(2) + 4*y(3) - y(4);
    d2y(end) = -y(end-3) + 4*y(end-2) - 5*y(end-1) + 2*y(end);
end

d2y = d2y / dx^2 ;
end