我想在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
我哪里做错了?
发布于 2019-04-10 22:18:45
差分式的理论误差为O(h^2)。函数的浮点求值将分别产生大约机器精度µ的相对误差。然后除以h^2。当两个误差之和约为平衡时,即h^4=mu或h=1e-4,即可获得两个误差的最佳和。
这当然是无效的,如果误差项的系数是零,就像f(x)=x^3一样。那么唯一的误差贡献就是浮点误差,对于较大的h,浮点误差是最小的,即使是h=1也会产生最小的误差。
对于像f(x)=sin(x)这样的较小函数,不同h的误差表现如下图所示(其中标记为x的变量是步长h)
发布于 2019-04-11 02:51:38
我不确定你做错了什么,但是下面的代码是有效的
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
https://stackoverflow.com/questions/55615774
复制