Matlab 1D波动方程FDM二阶及时,空间四阶

时间:2016-09-07 13:10:31

标签: matlab

我写了一个用FDM解决一维波动方程的函数。因此,我使用空间中的二阶精度和空间中的四阶精度以及显式FD方案。 我已经在Matlab中使用矩阵向量乘法方法实现了求解器函数(替代方法可以迭代完成),并具有周期性边界条件。

验证我使用制造解法的方法的代码。我的方法是假设解决方案为

p(t,x)=sin(x+t)+sin(x-t)

是周期性的,足够平滑和可区分的。我实现了一个源项f,它与以下函数的初始数据输入一样

function [x,t,P_End]= MMS(f,I,G,L,v,T,J,CFL,x)

% Initialisation

deltax=x(2)-x(1);
deltat=CFL*deltax/abs(v);
c=(v*deltat/deltax)^2;


t=(0:deltat:T);
N=length(t);

A=zeros(J,J);

for k=1:J

% periodic boundary condition
  if k==1 
     A(1,1)=-c*5/2;
     A(1,2)=c*4/3;
     A(1,3)=c/12;
     A(1,J-1)=c/12;
     A(1,J)=c*4/3;

   elseif k==J
      A(J,1)=c*4/3;
      A(J,2)=c/12;
      A(J,J-2)=c/12;
      A(J,J-1)=c*4/3;
      A(J,J)=-c*5/2;

 elseif k==2
      A(2,J)=c/12;
      A(2,1)=c*4/3;
      A(2,2)=-c*5/2;
      A(2,3)=c*4/3;
      A(2,4)=c/12; 

 elseif k==J-1
       A(J-1,1)=c*1/12;
       A(J-1,J-1)=-c*5/2;
       A(J-1,J)=c*4/3;
       A(J-1,J-2)=c*4/3;
       A(J-1,J-3)=c*1/12;

   else
        A(k,k-2)=c/12;
        A(k,k-1)=c*4/3;
        A(k,k)=-c*5/2;
        A(k,k+1)=c*4/3;
        A(k,k+2)=c/12;
   end
 end

    %Allocate memory
    P_0=zeros(J,1);
    b=zeros(J,1);
    H=zeros(J,1);

    %Initial data read in
    for i=1:J
        P_0(i)=I(x(i));
        b(i)=f(x(i),t(1));
        H(i)=G(x(i));
    end

    %Calculation of first time step separate because to time steps back 
    %are needed in the iteration
    P_1=0.5*A*P_0+(deltat^2/2)*b+2*deltat*H+P_0;

    P_n_minus_1=P_0;
    P_n=P_1;
    P_End=zeros(N,J); % Solution matrix
    P_End(1,:)=P_0;
    P_End(2,:)=P_1;

    for n=2:N
        for i=1:J
            b(i)=f(x(i),t(n));
        end

        %Iterative calculation for t_2,...,t_N
        P_n_plus_1=A*P_n+(deltat^2)*b-P_n_minus_1+2*P_n;

        %Overwriting
        P_n_minus_1=P_n;
        P_n=P_n_plus_1;

        P_End(n,:)=P_n_plus_1;
    end

    end

然后函数调用

clear all; clc; close all;

%% Initialisierung

    % Grid points in space x_0,...x_L
    x = -2 : 0.01 : 2;
    J = length(x);

    xDelta = x(2) - x(1);
    T = 2;
    v = 0.5; %velocity constant
    CFL = 0.5; %Courant Friedrich Lewis number

    %Source term right-hand side of the wave equation
    f = @(x,t) abs(v^2-1)*(sin(x+t)+sin(x-t));

    %Initial data for the estimated sound pressure function p(t,x), t=0
    I = @(x)  2*sin(x);

    % \partial p/ \partial t , t=0
    G = @(x) 0;

   [x,t,P_End]= MMS(f,I,G,v,T,J,CFL,x);

这个初始数据和源项输入导致一个解决方案,就像假定的解决方案一样,但在范围ob` +/- 10 ^ 24。 我在这做错了什么?我已经检查了数百次代码,但无法检测到任何代码错误。

感谢任何提示!

0 个答案:

没有答案