偏微分方程数值解实验报告一
实验题目:
求解
)1,0(
u
u
'
,5
tu
1)0(
(1)用 Euler 法和改进的 Euler 法求解,其中步长 h=0.1,0.05,0.01
(2)用三阶 Adams 外插法及内插法求解,步长 h=0.1,0.05,0.01
预备知识:
1.Euler 法的迭代格式及其误差分析。
2.预估-校正算法,改进的 Euler 法迭代格式及其误差分析。
3.差分与等距节点插值,Adams 外插法格式及误差估计。
4.高精度的单步法格式,Adams 内插法格式及其误差估计。
实验过程分析:
1.本次实验代码用 c++语言编写,编译器为 VC++6.0. Euler 法最简单的数值积分法,
数值格式也很简单。在将数学语言转化为计算机语言时,可以直接转化,无需作其他计算或
转换。在程序代码中,其数值格式用 C++代码表示为
u[j]=u[j-1]+h*(-5)*u[j-1];
在编写程序时,先输入步长 h 的值,针对 h 将区间(0,1)等分成 N=1/h 份。然后计算 u 在这
些节点上的近似值 iu 。经计算可以得出微分方程满足边值条件的解为
)(
tu
5
te
。计算真解
在节点上的值 )( itu 。输出时,只是输出 及数值解误差
-
.对其优良性进行分析。
按照书本上的分析,Euler 法的局部截断误差为
( 2hO
)
阶,故其全局误差为
)(hO 阶。因此
可以预期它的逼近效果不会很理想。
2.进行改进的 Euler 法格式实验时,由于右端项只与 u 有关,t 没有显式出现,故进行迭
代时,可以将右端的 1iu 移项到左边,合并后再进行迭代。但为了与书本同步,使用了书本
上介绍的预估-校正算法。虽然经计算它们的结果是一样的,但这个算法更具有一般性。预
估-校正格式如下:
u[j]=u[j-1];
//预测,让 u(i+1)=u(i)
for(k=0;k<150;k++)
u[j]=u[j-1]+h/2*((-5)*u[j-1]+(-5)*u[j]);
//校正
式中将校正进行了 150 次。得出的结果比较理想。改进的 Euler 法较 Euler 法复杂些,因此
其误差也会更小。全局误差达
( 2hO
)
阶。实验输出同上,只是输出 及数值解误差
-
.
对其优良性进行分析。
3.Adams 外插法比较复杂,用到的知识比较多。不过由于右端项比较特殊,可以将数值格
式化为很简单的格式。由于外插法的局部阶段误差为
2khO
(
)
阶,故其全局误差为
1khO
(
)
阶。按照题目的精度要求,本次实验选取 k=2.这时全局误差为 3 阶。在进行 的计算时,
u
需用到用到前面 ,
1,
i
u
i
2
的值。而题目中只是给出一个初值 0u 。至少还需要
1,uu 的值
2
为已知,数值格式才可以进行。在这里用了后面介绍的高精度单步法。精度也选为 3 阶,故
单 步 格 式 中 q 取 为 3 。 由 于 右 端 项 只 与 u 有 关 , 故 f 的 二 阶 导 数 要 算 出 也 不 算 难 。
f
'
25
,
fu
''
125
u
。代入化简后,格式如下:
u[1]=u[0]+h*(1.0-5.0/2.0*h+25.0/6.0*h*h)*(-5)*u[0];
u[2]=u[1]+h*(1.0-5.0/2.0*h+25.0/6.0*h*h)*(-5)*u[1];
在数值格式右端项中,用到了差分与等距节点插值的相关知识。系数 a[i]可以预先计算出
来。由于 k=2,故只需知道 a[0]-a[2]的值,经计算分别为 1,
1
2
,
5
12
.而 f 的差分最高为二
阶。算出来也很简便。将书本数值格式中的 a[j],
j f
jn
算出来后,进行化简。最终得出
以下结果:
u[i+1]=u[i]+h*(23.0/12.0*(-5.0)*u[i]-4.0/3.0*(-5.0)*u[i-1]+5.0/12.0*(-5.0)*u[i-
2]);
上式并未进行最简单的化简。但结果无异。实验输出同上。总的来说,Adams 外插法的精度
还是比较高的。且 k 愈大,精度越高。
4.Adams 内插法较外插法要复杂。不过由于右端项 f 只与 u 有关,故进行计算时,同样可
以先进行移项合并,再进行数值格式计算。但是在这里同样用了预估-校正方式。而在实际
计算中,两者结果无异,不过后者更具有代表性。根据内插法的局部截断误差为
3khO
(
)
,
故其全局误差为
2khO
(
)
阶。令 k+2=3,得 k=1.在进行 的计算时,由于右端含有 项,
故还需要
,
i uu
1
i
为已知的。由于只给出 一个初值 0u ,故至少还需知道 1u 的值,和外插法
一样,用高精度的单步法求出 ,误差为 3 阶,取 q=3.在右端的计算中,a[i]和上面的有
所不同,经计算分别为 1,
主要用到的格式如下:
1,
1
2
12
。而
的计算和上面一样。将它们代入,化简后,
u[1]=u[0]+h*(1.0-5.0/2.0*h+25.0/6.0*h*h)*(-5)*u[0]; //单步法求
//预测,让迭代格式右端中的 u(i+1)=u(i)
u[i+1]=u[i]+h*(5.0/12.0*(-5)*u[i]+2.0/3.0*(-5)*u[i]-1.0/12.0*(-5)*u[i-1]);
for(int r=0;r<1000;r++)//校正 1000 次
u[i+1]=u[i]+h*(5.0/12.0*(-5)*u[i+1]+2.0/3.0*(-5)*u[i]-1.0/12.0*(-5)*u[i-1]);
上式中,校正进行 1000 次,以保证足够的精度。根据书本的总结,内插法的 a[j]要比外插
法的小,又是隐式,故其精度要比外插法的要高。同样用真解
在节点 ix 上的值与
数值解 iu 进行比较,分析结果误差及该格式的优良性。
实验结果,误差分析及总结:
下面逐一对上述四种数值格式进行结果以及误差分析。并对它们进行比较。再进行实验
总结。一下所有的输出结果中,第一列为数值解,第二列为数值解与真实解之间的误差。
1.对于欧拉法,由于其算法简单,故其误差也相对比较大。根据分析,其全局误差为
)(hO 阶。而下面的结果当 h=0.1 时,精度刚好为 1 阶:
下面分别是 h=0.05,h=0.01 时的结果输出:
(h=0.05 时的结果,与 h 同阶)
从输出结果可以看出,该算法的全局误差都为
)(hO 阶。与理论结果一致。随着 h 的减小,
(h=0.01 时的结果)
误差也相应减小。当然这是建立在误差阶为
的基础上的。
2.下面分别是改进的 Euler 法在 h=0.1,0.05.0.01 时的结果截图:
(h=0.1)
(h=0.05)
(h=0.01,其中 e-006 表示 610 )
经分析,改进的 Euler 法的全局误差为
( 2hO
)
阶。而上面的结果则很好的符合了这个理论。
而 h 越小,则误差越小。且其误差比 Euler 法要好很多。这个也和理论相符。
3.下面分别是 Adams 外插法在 h=0.1,0.05,0.01 时的输出结果:
(h=0.1)
(h=0.05)
(h=0.01)
根据题目要求,全局误差要为 3 阶,应该选取 k=2.而当 h=0.1 及 0.01 时,出现部分结果的
误差为两阶。与理论结果不太符合。而 h 越小,则误差越小这个理论还是符合的。说明这个
数值格式不是很尽人意。而由于 u(2)和 u(3)是通过高精度的单步法求出来的,它们的误差
则无论 h 取何值,误差均为 3 阶,这个符合要求。说明了单步法还是比较准确的。
4.下面分别是 Adams 内插法在 h=0.1,0.05,0.01 时的输出结果:
(h=0.1)
(h=0.05)
内插法的误差要求同样为 3 阶,因此取 k=1。从结果看来,误差都符合要求。而且大部分都
去到了 4 阶,甚至更高。其中 u(2)是用高精度的单步法求出来的,它也达到了 3 阶的误
差要求。这也说明了高精度的单步法在这个初值问题中,是比较稳定的。
(h=0.01)
综合上述四个数值格式,发觉它们基本上涵盖了第一单元的主要数值格式。除了待定系
数法外,就连后面的单步法,也包括进去了。通过这次实验,对第一单元的主要内容进行了
一次复习以及总结。当然,限于知识水平,无法用实验的方法测试它们的稳定性,收敛性等
等。在这里仅是对误差大小进行分析。而就本题目来说,Euler 法,改进的 Euler 法以及 Adams
内插法都能满足精度要求。而 Adams 外插法则比要求少了一阶,这个是在完全符合书上的
理论要求的情况下进行的。而且在进行了很多次修改,用单步法给出的附加初值同样为 3
阶的情况下,确保迭代格式没有错误的情况下,结果还是一样。当然,如果附加初值采取更
高精度的单步法来球的话,可能后面的误差会控制的很好,但是这不符合题目要求,也没什
么意义。于是实验就此结束,不再做深入探究了。在实验过程中,发觉了一些值得注意的地
方,例如在改进的 Euler 法和 Adams 内插法中,应该用书上介绍的预估-校正法,这个更具
一般性,而且又可以验证它的可行性。在计算 a[i]时,应该特别留意外插法和内插法是不同
的,虽然看起来形式一样,等等。