Problem set

find the numerical solution of the following partial differential equation:


1.C - N  Scheme


%二阶波动方程的CN格式
A=[0,-1;-1,0;];
I=[1,0;0,1];
N=100;%空间划分多少步
h=1.0/100;
t=0.0001;
r=t/h;
step=200;%时间步数
U=zeros(2,N+1);
d=zeros(2,N+1);
a11=1:N+1;a12=1:N+1;a21=1:N+1;a22=1:N+1;
b11=1:N+1;b12=1:N+1;b21=1:N+1;b22=1:N+1;
c11=1:N+1;c12=1:N+1;c21=1:N+1;c22=1:N+1;
for i=1:1:N+1
    a11(i)=-0.25*A(1,1)*r;b11(i)=I(1,1);c11(i)=0.25*A(1,1)*r;
    a12(i)=-0.25*A(1,2)*r;b12(i)=I(1,2);c12(i)=0.25*A(1,2)*r;
    a21(i)=-0.25*A(2,1)*r;b21(i)=I(2,1);c21(i)=0.25*A(2,1)*r;
    a22(i)=-0.25*A(2,2)*r;b22(i)=I(2,2);c22(i)=0.25*A(2,2)*r;
end


V=zeros(N+1,step+1);
W=zeros(N+1,step+1);
u=zeros(N+1,step+1);%实际最终求的解
%第一步,求解得到V,M
%初始化,进行赋值
x=0:h:1;
V(:,1)=-exp(x);%初始值
W(:,1)=exp(x);%初始值
for k=1:1:step
    %边界值
    V(1,k)=-exp(-(k-1)*t);
    V(N+1,k)=-exp(1-(k-1)*t);
    %将V赋给U(1,).将W赋给U(2,)
    U(1,:)=V(:,k);
    U(2,:)=W(:,k);
    %追赶法求解
    
    for j=2:1:N
        d(:,j)=U(:,j)+0.25*A*r*(U(:,j+1)-U(:,j-1));
    end
    %边界条件
    d(:,1)=U(:,1)+0.25*A*r*U(:,2);
    d(:,N+1)=U(:,N+1)-0.25*A*r*U(:,N);
    for j=2:1:N+1
        A1=[a11(j),a12(j);a21(j),a22(j);];
        B=[b11(j-1),b12(j-1);b21(j-1),b22(j-1);];
        A1=B\A1;
        a11(j)=A1(1,1);a12(j)=A1(1,2);a21(j)=A1(2,1);a22(j)=A1(2,2);
        C=[c11(j-1),c12(j-1);c21(j-1),c22(j-1);];
        B=[b11(j),b12(j);b21(j),b22(j);];
        B=B-C*A1;
        b11(j)=B(1,1);b12(j)=B(1,2);b21(j)=B(2,1);b22(j)=B(2,2);
        d(:,j)=d(:,j)-A1*d(:,j-1);
    end
    B=[b11(N+1),b12(N+1);b21(N+1),b22(N+1);];
    d(:,N+1)=B\d(:,N+1);
    for j=N:-1:1
        C=[c11(j),c12(j);c21(j),c22(j);];
        B=[b11(j),b12(j);b21(j),b22(j);];
        d(:,j)=B\(d(:,j)-C*d(:,j+1));
    end
 
    V(:,k+1)=d(1,:);%求得VW
    W(:,k+1)=d(2,:);
end
%第二步从VW求得u
u(:,1)=exp(x);
for k=1:1:step
    u(1,k)=exp(-(k-1)*t);
    u(N+1,k)=exp(1-(k-1)*t);
    for i=1:1:N
        u(i+1,k+1)=u(i,k)+t*V(i,k)+h*W(i,k); 
    end
    u(1,k+1)=exp(-(k)*t);
    u(N+1,k+1)=exp(1-(k)*t);
end
2.C-F-L Scheme


%CFL格式求解
N=100;%节点数
M=200;%时间步
V=zeros(N+1,M+1);
W=zeros(N+1,M+1);
U=zeros(N+1,M+1);
t=0.0001;
h=1.0/N;
r=t/h;
v=zeros(N+1,1);
w=zeros(N+1,1);
%初始化数据
x=0:h:1.0;
V(:,1)=-exp(x);
x=0.5*h:h:1+h;
W(:,1)=exp(x);
%求解V W
for k=1:1:M
    V(1,k)=-exp(-(k-1)*t);
    V(N+1,k)=-exp(1-(k-1)*t);
    v=V(:,k);
    w=W(:,k);
    %求v n+1
    for i=2:1:N+1
        V(i,k+1)=v(i)+r*(w(i)-w(i-1));
    end
    V(1,k+1)=-exp(-k*t);
    V(1,k+1)=-exp(1-k*t);
    %求W n+1
    for i=2:1:N+1
        W(i,k+1)=w(i)+r*(V(i,k+1)-V(i-1,k+1));
    end
        W(1,k+1)=w(1)+r/2*(t+t);%边界值
end
U(:,1)=exp(x);
for k=1:1:M
    U(1,k)=exp(-(k-1)*t);
    U(N+1,k)=exp(1-(k-1)*t);
    for i=1:1:N
        U(i+1,k+1)=U(i,k)+t*V(i,k)+h*W(i,k);
    end
    U(1,k+1)=exp(-(k)*t);
    U(N+1,k+1)=exp(1-(k)*t);
end

3 隐格式
%Yin Scheme Second Order Equ
N=100;%节点数
M=200;%时间步
h=1.0/N;
t=0.0001;
A=1.0;
r=A*t/h;
V=zeros(N+1,M+1);
W=zeros(N+1,M+1);
v=zeros(N+1,1);
w=zeros(N+1,1);
u=zeros(N+1,M+1);
a=zeros(N+1,1);
b=zeros(N+1,1);
c=zeros(N+1,1);
d=zeros(N+1,1);
for i=1:1:N+1
    a(i)=-A*A*r*r/4;
    b(i)=1+A*A*r*r/2;
    c(i)=-A*A*r*r/4;
end
%初始值
x=0:h:1;
V(:,1)=-exp(x);
m=0.5*h;
x=m:h:1+h;
W(:,1)=exp(x);
%求解
for k=1:1:M
    V(1,k)=-exp(-(k-1)*t);
    V(N+1,k)=-exp(1-(k-1)*t);
    v=V(:,k);
    w=W(:,k);
    %先求v,n+1
    for i=2:1:N
        d(i)=v(i)+A*r*(w(i+1)-w(i))+A*A*r*r/4*(v(i+1)-2*v(i)+v(i-1));
    end
    d(1)=v(1)+A*r*(w(2)-w(1))+A*A*r*r/4*(v(2)-2*v(1));
    d(N+1)=v(N+1)+A*r*(-w(N+1))+A*A*r*r/4*(-2*v(N+1)+v(N));
    for i=2:N+1
        a(i)=a(i)/b(i-1);
        b(i)=b(i)-c(i-1)*a(i);
        d(i)=d(i)-a(i)*d(i-1);
    end
    d(N+1)=d(N+1)/b(N+1);
    for i=N:-1:1
        d(i)=(d(i)-c(i)*d(i+1))/b(i);
    end
    V(:,k+1)=d;
    V(1,k+1)=-exp(-(k)*t);
    V(N+1,k+1)=-exp(1-(k)*t);
    d=V(:,k+1);
    %求W n+1
    for i=2:1:N+1
        W(i,k+1)=w(i)+A*r/2*(d(i)-d(i-1)+v(i)-v(i-1));
    end
    W(1,k+1)=w(1)+A*r/2*(t+t);
    
end
%求u
u(:,1)=exp(x);
for k=1:1:M
    u(1,k)=exp(-(k-1)*t);
    u(N+1,k)=exp(1-(k-1)*t);
    for i=1:1:N
        u(i+1,k+1)=u(i,k)+t*V(i,k)+h*W(i,k);
    end
    u(1,k+1)=exp(-(k)*t);
    u(N+1,k+1)=exp(1-(k)*t);
end