给定初边值条件的椭圆形方程数值解法

问题描述:

给定初边值条件的椭圆形方程数值解法_第1张图片
给定初边值条件的椭圆形方程数值解法_第2张图片
matlab源代码:
1、fangcheng.m:
% 注:1、运算时间可能稍微有些长, 请耐心等待!
%     2、运算结果与精确解相当接近,需要多放大几次观察

%% 程序从这里开始执行
clear,clc
C1=calculate(0.02);%这里的参数分别是将【0,1】区间50,100,200,400等分后得到
C2=calculate(0.01);%返回值是误差范数向量,每个向量含有6种范数
C3=calculate(0.005);
C4=calculate(0.0025);

p1=log(C1./C2)/log(2);
p2=log(C2./C3)/log(2);
p3=log(C3./C4)/log(2);%误差阶

pmetrix=[p1;p2;p3];
p=mean(pmetrix);      %p是误差阶数平均值
1、 calculate .m:
function fan=calculate(step)
%% 设置沿t方向与x方向的选取采样点的步长(自由设置)
h=step;%x方向
r=0.1;
k=r*h.^2;%t方向

%% 变化范围、采样点数目、采样点的计算
T=0.001;
X=1;
n=T/k;%t采样数目
m=1/h;%x方向采样数目 = 区间长度 / 采样步长

t=0:k:T;% 采样点的坐标存储在数组 t[]、x[]中
x=0:h:X;%初值点、边界上的点也存在这两个数组中
tt=t(2:n+1); %#ok
xx=x(2:m);%数值差分预测区,内部点

t0=sin(pi*(0:h:1))';%初值点,边值点均为0,不需要存储

%% 以精确解并作出图像
exact=zeros(1,m-1);%记录精确解
for i=1:1:m-1
        exact(i)=exp(1).^(-pi^2*T)*sin(pi*xx(i));
end
figure;
plot(xx,exact,'g');%仅画出t=T时的图像,而且仅画出内部需要近似的点
hold on

%% 使用古典隐式格式求数值解、追赶法求解方式是逐层求解
A=eye(m-1);%每一层矩阵A相同,事先求出
for i=1:1:m-1
    A(i,i)=1+2*r;
    if i~=1&&i~=m-1
        A(i,i+1)=-r;
        A(i,i-1)=-r;
    end
end
A(1,2)=-r;%补充两点
A(m-1,m-2)=-r;

lastpoint=t0(2:m);%上一层节点
for j=1:1:n
    newpoint=A\lastpoint;%由边值条件为0,等式右边直接使用lastpoint不做改变
    lastpoint=newpoint;%得到新一层的节点
end
implicit=lastpoint;
plot(xx,implicit,'r*');
hold on

%% 使用C-N格式求数值解、追赶法求解方式是逐层求解
A=eye(m-1);%每一层矩阵A相同,事先求出
for i=1:1:m-1
    A(i,i)=1+r;
    if i~=1&&i~=m-1
        A(i,i+1)=-0.5*r;
        A(i,i-1)=-0.5*r;
    end
end
A(1,2)=-0.5*r;%补充两点
A(m-1,m-2)=-0.5*r;

B=eye(m-1);%每一层矩阵B相同,事先求出
for i=1:1:m-1
    B(i,i)=1-r;
    if i~=1&&i~=m-1
        B(i,i+1)=0.5*r;
        B(i,i-1)=0.5*r;
    end
end
B(1,2)=0.5*r;%补充两点
B(m-1,m-2)=0.5*r;

lastpoint=t0(2:m);%上一层节点
for j=1:1:n
    newpoint=A\(B*lastpoint);
    lastpoint=newpoint;%得到新一层的节点
end
CN=lastpoint;
plot(xx,CN,'b.');

%% 误差分析
error1 = implicit -exact';
error2 = CN -exact';
figure;
plot(xx,error1,'r');
hold on
plot(xx,error2,'y');

%% 选定 h 条件下,1范数、2范数、无穷范数的计算
error1faninf=norm(error1,inf);
error1fan1=norm(error1,1);
error1fan2=norm(error1,2);%隐式

error2faninf=norm(error2,inf);
error2fan1=norm(error2,1);
error2fan2=norm(error2,2);%C-N

fan=[error1faninf,error1fan1,error1fan2,error2faninf,error2fan1,error2fan2];

end



你可能感兴趣的:(数值方法)