我正在尝试使用一阶 Godunov 方案以数值和因此我写其中如果和否则。
这是一个到处都有的 Matlab 代码:
%% parameters
N=99; M=99;
%Allocate memory
x=linspace(0,1,M+1);
mk=zeros(N+1,M+1); a_ph=ones(N,M)*0.5;
%% Set initial conditions
sigma=0.08;
mk(1,:)=1/sqrt(2*pi*sigma^2)*exp(-(x-0.5).^2/(2*sigma^2));
q=dt/h;
for i=1:N
ai=ak_ph(i,2:M); aim=a_ph(i,1:M-1); %local var
B=diag([0,ai.*(ai>=0),0]) + diag([0,ai.*(ai<0)],1) ...
- diag([0,aim.*(aim<0),0]) - diag([aim.*(aim>=0),0],-1);
mk(i+1,:)=(eye(M+1)-q*B)*mk(i,:)';
end
[X1,X2]=meshgrid(x1,x2);
surf(X1,X2,mk','FaceColor','interp','EdgeColor','none')
当我计算解决方案时,这就是我得到的:
我期望波以均匀的速度传播,但同时振幅变小,这很奇怪。波峰处也有涟漪。有人有建议吗?