带有奇怪问题的截断错误图

计算科学 有限差分
2021-11-30 10:43:55

我有一个函数f(x) = sin(x)/x^3,我试图使用一阶、二阶和四阶有限差分方案来估计其一阶导数。我试图在 MATLAB 中绘制截断误差,但我发现自己的误差随着步长的减小而增加。我不确定我错在哪里。附上我的代码片段。

syms y
dx = linspace(10^(-5), 10^(-0));
f = @(x) sin(x)/x^3;
x = 4;

df1 = (f(x+1)-f(x))./dx;
df2 = (f(x+1)-f(x-1))./(2.*dx);
df4 = (f(x-2)-8*f(x-1)+8*f(x+1)-f(x+2))./(12.*dx);

exact = cos(x)/x^3 - (3*sin(x))/x^4;

for i=1:length(dx)
    error1(i) = abs(df1(i)-exact)
    error2(i) = abs(df2(i)-exact)
    error4(i) = abs(df4(i)-exact)
end

figure 
loglog(dx,error1,'r','linewidth',2)
hold on
loglog(dx,error2,'b','linewidth',2)
loglog(dx,error4,'k','linewidth',2)

作为步长函数的截断误差

1个回答

代码中缺少的东西是在计算有限差分方案中的函数值时考虑了一个因子 dx,这导致它们变得更大,因为它们在底部除以较小的步长并在分子中爆炸。

所以正确的代码看起来像:

df1 = (f(x+1*dx)-f(x))./dx;
df2 = (f(x+1*dx)-f(x-1*dx))./(2.*dx);
df4 = (f(x-2*dx)-8*f(x-1*dx)+8*f(x+1*dx)-f(x+2*dx))./(12.*dx);