偏微分方程数值实验报告及算法实现(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
偏微分方程数值实验报告一
实验题目:利用有限差分法求解
.
0)1(,0)1(),()()(==-=+''-u u x f x u x u 真解为
)1()(22x e
x u x -=-
实现算法:对于两点边值问题 ,
)(,)(,,d 22βα==∈=-b u a u l x f dx
u (1) 其中),(b a l =f b a ),(<为],[b a l =上的连续函数,βα,为给定常数.
其相应的有限差分法的算法如下:
1.对求解区域做网格剖分,得到计算网格.在这里我们对区间l 均匀剖分n 段,每个剖分单元的剖分步长记为n
a b h -=. 2.对微分方程中的各阶导数进行差分离散,得到差分方程.运用的离散方法有:
方法一:用待定系数和泰勒展开进行离散
)()()()
(d )(d 111122++--++≈i i i i i i i i x u x u x u x x u ααα 方法二:利用差商逼近导数
2
1122)()(2)()(d )(d h x u x u x u x x u i i i i i -++-≈ (2) 将(2)带入(1)可以得到
)()()()(2)(211u R x f h
x u x u x u i i i i i +=+---+, 其中)(u R i 为无穷小量,这时我们丢弃)(u R i ,则有在i x 处满足的计算公式:
1,...,1)()()(2)(211-==+---+n i x f h
x u x u x u i i i i , (3) 3.根据边界条件,进行边界处理.由(1)可得
βα==n u u ,0 (4)
称(3)(4)为逼近(1)的差分方程,并称相应的数值解向量1-n U 为差分解,i u 为)(i x u 的近似值.
4.最后求解线性代数方程组,得到数值解向量1-n U .
程序代码:
第一步:编写有限差分格式相关函数
function [ x,U ]=FDld_bvp(N,f,a,b,u)
%******************************************************************** %% FD1d_bvp利用中心差分格式求解两点边值问题
%参数:
% 输入参数:
% 整数N,网格节点数,
% 函数f(x),计算右端函数f(x);
% a,计算区间左端点
% b,计算区间右端点
% u,真解函数
% 输出参数:
% 差分解向量U
% 均匀剖分区间[a,b],得到网格x(i)=a+(i-1)*(b-a)/(N-1)
h=(b-a)/(N-1);
x=(a:h:b)';
% 创建线性差分方程组系数矩阵
c1=-1/h/h;
c2=2/h/h+1;
g=[c1*ones(1,N-2),0];
c=[0,c1*ones(1,N-2)];
d=[1,c2*ones(1,N-2),1];
A=diag(g,-1)+diag(d)+diag(c,1);
% 创建线性差分方程组右端项
rhs=f(x);
rhs(1)=u(x(1));
rhs(N)=u(x(N));
% 求解上述代数系统
U=A\rhs;
end
function[e0,e1,emax]=FD1d_error(x,U,u_exact)
%% FD1d_ERROR 计算有限差分误差
% 参数:
% 输入参数:
% x,网格节点坐标向量
% U,网格节点坐标向量上的有限差分数值解向量Ux
% u_exact,真解函数
% 输出参数:
% e0
% e1
% emax
N=length(x);
h=(x(end)-x(1))/(N-1);
ue=u_exact(x);%真解在网格点处的值x
ee=ue-U;
e0=h*sum(ee.^2);
e1=sum((ee(2:end)-ee(1:end-1)).^2)/h;
e1=e1+e0;
e0=sqrt(e0);
e1=sqrt(e1);
emax=max(abs(ue-U));
end
function FD1d_bvp_test
%%测试脚本
% 初始化相关数据
N=[6,11,21,41,81];
L=-1;
R=1;
emax=zeros(5,1);
e0=zeros(5,1);
e1=zeros(5,1);
%%求解并计算误差
for i = 1:5
[x,U] =FD1d_bvp(N(i),@f ,L,R,@u);
[e0(i),e1(i),emax(i)]=FD1d_error(x,U,@u);
X{i}=x;
UN{i}=U;
end
ue=u(X{5});
%% 显示真阶及不同网格剖分下的数值解
plot(X{5},ue,'-k*',X{1},UN{1},'-ro',X{2},...
UN{2},'-gs',X{3},UN {3},'-bd ',...
X{4},UN{4},'-ch ',X{5} , UN {5},'-mx');
title('The solution plot');
xlabel('x');ylabel ('u');
legend('exact','N=6','N =11','N=21','N =41','N =81'); %% 显示误差
format shorte
disp ('emax e0 e1 ');
disp ([ emax , e0 , e1 ]);
end
第二步:编写方程的右端函数和真解分别保存为m f .和m u . function f=f(x)