偏微分方程数值实验报告及算法实现(1)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档