我的代码是否适合这种以空间为中心的近似值

时间:2019-05-06 22:57:09

标签: matlab math

我应该找到时间步数,即所采取的步数,但我的答案不正确,谢谢我的代码上的任何输入,这将是主要的帮助。此外,平流方程式的中心间距方法是否正确使用? 该程序是matlab

N=200;
x=linspace(-10,10,N);
dx=x(2)-x(1);
c=-0.9;
t=0;
dt=0.2;
timestep=0;
f=@(x)exp(-5*x.^2);
y=f(x)';
figure(1),plot(x,y)
title(['Current time=',num2str(t)])
drawnow

使用居中空间(我认为这是错误的)

A=eye(N)-(c*(dx/dt))*((diag(ones(N-1,1),1)-diag(ones(N-1,1),-1))/(2*dx));

%time ends when y goes to 0.01

while abs(y(end))<0.001 && abs(y(1))<0.001
y=A*y;
t=t+dt;
timestep=timestep+1;
figure(1),cla
plot(x,y)
hold on
plot(x,f(x-c*t),'r')
title(['Current time=',num2str(t)])
drawnow
end

1 个答案:

答案 0 :(得分:0)

这是数值不稳定性的结果,因此,每个步骤的任何小误差都会成指数增长到无穷大。

您要模拟的PDE为1D Convection Equation。您使用的有限差分方案是FTCS,以FTCS为前移时间为中心的空间(即您使用下一个时间和当前时间来评估时间差,并使用左右空间来评估空间差)。 求解对流方程时,FTCS总是不稳定的。

如果要获得稳定的解决方案,请针对c<0条件,尝试 FTFS (使用当前空间和右侧空间,而不是左侧和右侧)。因此,您的矩阵A应该像:

A=eye(N)-(c*(dt/dx))*((diag(ones(N-1,1),1)-diag(ones(N,1),0)));

(如果这不是您要处理的方程式,请更改为要使用的内容)

此外,要使FTFS稳定,必须确保:abs(c*dt/dx)<1为true。如果不正确,请更改dt和dx。

如果c> 0,则必须将FTBS用于前向后-向后空间。

有关更多参考,您可以访问有关数字求解PDE的任何书籍。

希望能提供帮助。