当前位置:文档之家› 两点边值问题的差分求解

两点边值问题的差分求解

微分方程数值解实验报告
姓名 丁建伟 学号 200708020211 日期 2010.11.25
实验项目 两点边值问题的差分求解 指导教师 徐强
一、上机实验的问题和要求(需求分析):
实验内容:
(I) 分别在步长h=1/20,1/40,1/80,1/160情形下用中心差分格式计算齐次两点
边值问题-u"=f,u(0)=u(1)=0。其中f(x) = 100*exp(-10*x),精确解为u(x) =
1 - (1-exp(-10))*x - exp(-10*x)
(II) 给出差分解近似精确解在无穷范数和L2范数下的误差阶。
目的与要求:
掌握中心差分格式的程序实现
掌握分析算法误差的方法
二、程序设计的基本思想,原理和算法描述:

基本思想及原理:
做均匀网格剖分:

1010Nxxx
,分点ihxi步长nh1

在节点ix处,对微分方程离散化)(22xfdxud
)(12 )()(2)(344222211hOdxudhdxudhxuxuxuiiiii



有)()( )()(2)(211uRxfhxuxuxuiiiii
其中 2434()()12iihduRuOhdx
记u在节点Nkxk~0,数值解为 Nkuk~0,,
则有,2:211iiiiihfhuuuuL
比较知)()(:)(uRxfxuLiiih
所以()()ihiiRuLuxLu
表示用差分算子hL代替微分算子L产生的误差
称之为(局部)截断误差。这里关于h的阶为 )(2hO。

注意()iiLufx
所以()()()ihiiRuLuxfx
由此知:(局部)截断误差可视为差分格式,将数值解换成相应真解值后,左端
减右端,再做Taylor展式获得的(可作为计算公式)。
方程的联立形式(中心差分格式)



0,01~1,20211Niiiiuu
nif

h

uuu

矩阵形式 bAU(其中 A 是三对角矩阵)
又因为A是三对称矩阵,而且符合追赶法的使用条件,故可用追赶法求解U的解。

三、主要程序代码或命令:
#include
#include
#define MAX 200 /*预定义数组大小*/
void main()
{ int n,i; /*初始化阶数n*/
float u[MAX],y[MAX];
float F[MAX],f[MAX],m[MAX];
float h,x; /*步长和剖分点*/
printf("请输入等分数n值:");
scanf("%d",&n); /*读入阶数*/
h=1/float(n);
m[1]=-0.5; /*使用追赶法求解系数矩阵三对称的线性方程组*/
for(i=2;i<=n-2;i++)
m[i]=-1/(2+m[i-1]);
for(i=1,x=h;x<1.0;x+=h,i++)
{F[i]=100*exp(-10*x);
f[i]=1-(1-exp(-10))*x-exp(-10*x); }
y[1]=F[1]/(2/(h*h));
for(i=2;i<=n-1;i++)
y[i]=(F[i]+(1/(h*h)*y[i-1]))/(2/(h*h)+(1/(h*h)*m[i-1]));
u[n-1]=y[n-1];
for(i=n-2;i>=1;i--)
u[i]=y[i]-m[i]*u[i+1];
for(i=1;i{ printf("请输出u[%d]的值:%f;",i,u[i]);
printf("——精确解为%f",f[i]);
printf("误差为%f",fabs(u[i]-f[i]));
printf("\n");}
}
四、调试和运行程序过程中产生的问题及采取的措施:
1.编译时出错,若想在主函数和被调用函数都使用一些变量,必须把这些变量设为全局变量。
2.编译时,没有注意数据类型转换,如float h;h=1/n;是错误的,因为n是整形的,当n
值大于1时,h老为零。应进行模式转换,h=1/float(n);这样才是正确的。
3.对浮点数求绝对值时,应使用fabs()函数,而不是abs()。
4.注意乘除的计算,不能直接写成2x等,必须加上符号,2*x。
五、运行输出结果及分析:
上述程序在Visual C++ 6.0环境下加以实现。经过多次测试,程序运行正确。例如:
分别输入n值:20 ,40,运行结果如图所示,图中显示了每一步的值及端点误差。

请输入等分数n值:20

输入n值:40
由图可知:
a.四种步长下无穷范数分别为:h=1/20时为e1=0.013742,h=1/40时为e2=0.003477,
h=1/80时为e3=0.000872,h=1/160时为e4=0.000218。计算可得差分解近似精确解在无穷
范数下误差阶数为二阶。(e=max{u[i]})
b.四种步长下L2范数分别为:h=1/20时为e1'=0.009277,h=1/40时为e2'=0.002342,
h=1/80时为e3'=0.000586,h=1/160时为e4'=0.000145。计算可得差分解近似精确解在L2

范数下误差阶数为二阶。(2/111)('2niiue)
通过这次课程设计:
1. 我又进一步巩固了C语言的基础。
2. 做课程设计达到了理论与实践结合的目的,提高了自己的编程能力。
3. 对数值分析里求解线性方程组的追赶法复习了一下,加深了理解。
4. 掌握中心差分格式的程序实现和分析算法误差的方法。

相关主题