偏微分方程数值解报告一 下载本文

内容发布更新时间 : 2024/6/11 2:24:12星期一 下面是文章的全部内容请认真阅读。

偏微分方程数值解实验报告一

实验题目:

?u'??5u,t?(0,1) 求解 ?

?u(0)?1(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在这些节点上的近似值ui。经计算可以得出微分方程满足边值条件的解为u(t)?e?5t。计算真解在节点上的值u(ti)。输出时,只是输出ui及数值解误差u(ti)-ui.对其优良性进行分析。按照书本上的分析,Euler法的局部截断误差为O(h2)阶,故其全局误差为O(h)阶。因此可以预期它的逼近效果不会很理想。

2.进行改进的Euler法格式实验时,由于右端项只与u有关,t没有显式出现,故进行迭代时,可以将右端的ui?1移项到左边,合并后再进行迭代。但为了与书本同步,使用了书本上介绍的预估-校正算法。虽然经计算它们的结果是一样的,但这个算法更具有一般性。预估-校正格式如下:

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法复杂些,因此其误差也会更小。全局误差达O(h2)阶。实验输出同上,只是输出ui及数值解误差u(ti)-ui.对其优良性进行分析。

3.Adams外插法比较复杂,用到的知识比较多。不过由于右端项比较特殊,可以将数值格式化为很简单的格式。由于外插法的局部阶段误差为O(hk?2)阶,故其全局误差为O(hk?1)阶。按照题目的精度要求,本次实验选取k=2.这时全局误差为3阶。在进行ui?1的计算时,需用到用到前面

ui,ui?1,ui?2的值。而题目中只是给出一个初值u0。至少还需要u1,u2的值

为已知,数值格式才可以进行。在这里用了后面介绍的高精度单步法。精度也选为3阶,故单步格式中q取为3。由于右端项只与u有关,故f的二阶导数要算出也不算难。

f'?25u,f''??125u。代入化简后,格式如下:

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,

15,.而f的差分最高为二212阶。算出来也很简便。将书本数值格式中的a[j],?j?fn?j算出来后,进行化简。最终得出以下结果:

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有关,故进行计算时,同样可以先进行移项合并,再进行数值格式计算。但是在这里同样用了预估-校正方式。而在实际计算中,两者结果无异,不过后者更具有代表性。根据内插法的局部截断误差为O(hk?3),故其全局误差为O(hk?2)阶。令k+2=3,得k=1.在进行ui?1的计算时,由于右端含有

ui?1项,

故还需要ui,ui?1为已知的。由于只给出一个初值u0,故至少还需知道u1的值,和外插法一样,用高精度的单步法求出u1,误差为3阶,取q=3.在右端的计算中,a[i]和上面的有所不同,经计算分别为1,?主要用到的格式如下:

u[1]=u[0]+h*(1.0-5.0/2.0*h+25.0/6.0*h*h)*(-5)*u[0]; //单步法求u1

//预测,让迭代格式右端中的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]要比外插法的小,又是隐式,故其精度要比外插法的要高。同样用真解u(t)?e数值解ui进行比较,分析结果误差及该格式的优良性。

?5t11j,?。而??fn?j的计算和上面一样。将它们代入,化简后,212在节点xi上的值与

实验结果,误差分析及总结:

下面逐一对上述四种数值格式进行结果以及误差分析。并对它们进行比较。再进行实验总结。一下所有的输出结果中,第一列为数值解,第二列为数值解与真实解之间的误差。

1.对于欧拉法,由于其算法简单,故其误差也相对比较大。根据分析,其全局误差为

O(h)阶。而下面的结果当h=0.1时,精度刚好为1阶:

下面分别是h=0.05,h=0.01时的结果输出:

(h=0.05时的结果,与h同阶)

(h=0.01时的结果)

从输出结果可以看出,该算法的全局误差都为O(h)阶。与理论结果一致。随着h的减小,误差也相应减小。当然这是建立在误差阶为O(h)的基础上的。