使用C语言解常微分方程CODE_第1页
使用C语言解常微分方程CODE_第2页
使用C语言解常微分方程CODE_第3页
使用C语言解常微分方程CODE_第4页
使用C语言解常微分方程CODE_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.解常微分方程姓名: Vincent年级: 2010,学号: 1033* ,组号: 5(小组),4(大组)1. 数值方法 :我们的实验目标是解常微分方程,其中包括几类问题。一阶常微分初值问题,高阶常微分初值问题,常微分方程组初值问题,二阶常微分方程边值问题,二阶线性常微分方程边值问题。对待上面的几类问题,我们分别使用不同的方法。? 初值问题使用 龙格 -库塔 来处理? 边值问题用打靶法来处理? 线性边值问题有限差分法初值问题我们分别使用? 二阶 龙格 - 库塔 方法? 4 阶 龙格 - 库塔 方法来处理一阶常微分方程。理论如下:对于这样一个方程y (t)f (t, y)当 h 很小时,我们用泰

2、勒展开,k1hf (tk , yk )k2hf (tka1h, ykLkihf (tkai h, yk当我们选择正确的参数对于二阶,我们有:b1 1k1)i1hbij k j )j1aij,bij 之后,就可以近似认为这就是泰勒展开。y( th)y( t)h Af 0Bf 1其中f0f (t, y)f1f (tPh, yQhf0 )经过前人的计算机经验,我们有,.选择 A=1/2,B=1/2,则 P=1,Q=1,于是又如下形式,这也使休恩方法的表达式。所以我们称其为龙格(库塔)休恩方法hy(th)y(t)f (t , y)f (th, yhf (t, y)2对于 4 阶龙格方法,我们有类似的想

3、法,我们使用前人经验的出的系数,有如下公式yn 1ynh2k2 2k3 k4 ),(k16k1f ( tn , yn ),hhk2f (tn2 , yn2 k1 ),k3f (tnh , ynh k2 ),22k4f (tnh, ynhk3 ).对于高阶微分方程及微分方程组我们用? 4 阶龙格 -库塔方法来解对于一个如下的微分方程组y1f1 (t, y1,L , yn ),Lynfn (t , y1,L , yn ).y1 (t0 )y1,0 ,Lyn (t0 ) yn ,0我们可以认为是一个一阶向量微分方程,所以可以用龙格-库塔方法的向量形式解。对于一个高阶的微分方程,形式如下:y( n )

4、( x)fL( n 1),t, y, y , , yy(t0 )0 ,Ly( n1) (t0 )n 1我们可以构建出一个一阶的微分方程组,令y1 (t)y (t ),Lyn 1(t)y(n1) (t)则有.yn1( x)f t, y, y1 ,L , yn 1 ,yn2 ( x)yn 1 ( x),My2 ( x)y2 (x),y (x)y1( x)y(t0 )0 ,其中,初值为y1 (t0 )1 ,Lyn 1(t0 )n1所以我们实际只要解一个微分方程组y1f1 (t, y1,L, yn ),y1(t0 )y1,0 ,L其中初值为Lynfn (t , y1,L, yn ).yn (t0 )y

5、n,0使用 4 阶龙格 -库塔方法,对于 k1,n有,ym 1ymhfk,12 fk ,22 fk ,3+fk,4kk6其中 , h 是步长, m是递归的点。fk ,1fk (tm, y1m, y2m,., ynm )ff(th , ymh f, ymh f,., ymh f)k ,2km2121,1222,1n2n,1fk ,3fk(tmh , y1mhf1,2 , y2mhf2,2 ,., ynmhfn,2 )2222fk ,2fk (tmh, y1mhf1,3 , y2mhf2,3 ,., ynmhfn,3 )使用这个向量形式的龙格-库塔方法我们便可就出方程的数值解。边值问题对于边值问题

6、,我们分为两类? 一般的边值问题? 线性边值微分方程一般的边值问题,我们是使用打靶法来求解,对于这样一个方程x f (t , x, x), atb边界为, x(a), x(b).主要思路是,化成初值问题来求解。我们已有.x(a),我们估计 x(a)mk利用初值问题方法求解出x(b)sk我们用割线法迭代,使得在进行一定数量的步骤后,sk ;这样我们便可求出方程的解。? 线性微分方程边值问题对于这样的问题,我们可以使用一个更加高效的方法,有限差分法。对于如下方程x (t )p(t) x(t)q(t )x(t )r (t )ta, bx(a), x(b)其中 p, q, r 是 t 的函数我们对其进

7、行差分tnb aa nh, hNh 是步长当 h 足够小时,我们有x (tn )xn 12xnxn 1h2x (tn )xn 1xn 1 .2h这样的话,我们的微分方程可以写成,x2xxh2p(t) xn 1xn 1q(t)xnr (t)0n 1nn 1n2hnn1h2qnxn1h2L2 pn xn 12 h2 pn xn 1hrn , n 1, , N 1x0, xN于是我们得到了个线性方程组.2hr2h q112p10h2hx112 p22 hq212 p2x2h pnh pn12 h2 qn1xn22xN 2h pN 22 h2qN 21 h pN 21xN 1r22h pN 12 h2

8、qN 1012其中hhe0( 12 p1 ) , en( 12 pN 1)这样的话我们求解出x对于上面的矩阵,我们可以分解出两个三角阵,然后回代求解便可。b1c1x1f1a2b2c2x2f2OOOMMA x fan 1bn 1cn 1xn 1f n 1anbnxnf n其中 A 可以写成d11u1l 2d21u2AOOOln 1dn 11un 1l n dn1其中(1)l kak , k2,L,n(2)d1b1, u1c1 / b1 ,(3)dkbkak uk 1for k2,L, n1ukck / dk(4) dn bn anun 1我们用回代法可以直接求解.2h r1e02h r22h r

9、nh2rN 2h2 rN 1en.AxfLUxfLy f ,Ux y回代求出 yy1f1 / d1yk( fkak yk 1) / dk , k 2,L , n再次回代,求出xxnynxkykLuk yk 1, k n 1, ,1至此,我们便求出了目标方程的解2. 流程图? 二阶龙格 - 库塔对于 i = 0 到 M-1;yi+1 = yi + h / 2 * (fun(t, yi) + fun(t + h, yi + h*fun(t, yi);return y;? 4 阶龙格 -库塔对于 i = 0 到 M-1;yi + 1 = yi + h / 6 * (fun(t, yi) + 2 *

10、fun(t + h / 2, yi + h / 2 * fun(t, yi) + 2 * fun(t + h / 2, yi + h / 2 * fun(t + h / 2, yi + h / 2 * fun(t, yi) +fun(t + h, yi+h*fun(t + h / 2, yi + h / 2 * fun(t + h / 2, yi + h / 2 *fun(t, yi);return y;? 4 阶龙格 -库塔解方程组对于 k= 0 到 M-1;对于 i= 0 到 N;fun(t, yk, dy0)对于 i= 0 到 N;tempdyj = ykj + h / 2 * dy0j

11、;fun(t + h / 2, tempdy, dy1);对于 i= 0 到 N;tempdyj = ykj + h / 2 * dy1j;fun(t + h / 2, tempdy, dy2);对于 i= 0 到 N;tempdyj = ykj + h * dy2j;fun(t + h, tempdy, dy3);yk+1i = yki + h / 6 * (dy0i + 2 * dy1i + 2 * dy2i + dy3i);return y;? 打靶法当 errepsilony = RKSystem4th( fun, 2, t0, u, tn, M);f0 = yM-10 - b;u1

12、= y01;y = RKSystem4th( fun, 2, t0, v, tn, M);.f1 = yM-10 - b;v1 = y01;x2= u1 - f0 * (v1-u1)/(f1-f0);u1 = v1;v1 = x2;err = fabs(u1 - v1);return y;? 有限差分法对 i 从 0 到 m;求出, b,r,a,cbi = 2 + h*h*qfun(t); ri = -h*h*rfun(t);ai = -h / 2 * pfun(t) - 1;ci = h / 2 * pfun(t) - 1;r0 = r0 - (-h / 2. )*( pfun(t0+h)

13、- 1.)*alpha;rm - 1 = rm - 1 - (h / 2 * pfun(tn - h) - 1)*beta;求出 d,ud0 = b0;u0 = c0 / b0;对 i 从 1 到 m - 1di = bi - ai * ui - 1;ui = ci / di;dm - 1 = bm - 1 - am - 1 * um - 2;回代y0 = r0 / d0;对于 i 从 到 m;yi = (ri - ai * yi - 1) / di;xm = ym -1;对 i 从 m 2 到 0xi + 1 = yi - ui * xi + 2;x0 = alpha;xM - 1 = be

14、ta;return x;3. 代码实现过程查看附件4. 数值例子与分析I. 解下面的方程y et / y,y(0)2.求 t=5 时, y 的值使用 3 中代码执行得到.My(5) 2 阶方法解y(5)4 阶方法解2 阶方法误差4 阶方法误差1017.48396030236717.2874974364310.1973667048670.0009038389302017.33330232997517.2866491508970.0467087324740.0000555533974017.29797386145017.2865970413230.0113802639490.00000344382

15、28017.28940346580617.2865938118750. 0028098683050. 00000021437416017.28729178163917.2865936108720.0006981841380.000000013372对比发现4 阶精度远高于2 阶精度当我们细分到一定程度之后,我们发现误差的减小慢慢变小。所以,若需要极高的精度的话会花费大量的计算资源。II. 解下面的方程组x f (t, x, y)xxy101 x2 ,y g(t, x, y)xyy201 y2 ,x(0)2, y(0)1,t0,30.我们选择M=1000 来细分运用 3 中代码,我们求解得x 3

16、00.990034y 300.842214III. 解下面高阶微分方程 (震动方程 )0.15 y1278.78y1110.57y20,0.15 y2278.78y2110.57y10,y1 (0)y2 (0)0,y1 (0)y2 (0)1,t0,0.2.运用 3 中代码,我们取步长h=0.02, 我们求解得tx(t)x(t)y(t)y(t)0.0000000.0000001.0000000.0000001.0000000.0200000.0185090.7847200.0185090.7847200.0400000.0290490.2327450.0290490.2327450.060000

17、0.027103-0.4185200.027103-0.4185200.0800000.013522-0.8893150.013522-0.8893150.100000-0.005849-0.977698-0.005849-0.9776980.120000-0.022687-0.646168-0.022687-0.6461680.140000-0.029763-0.037571-0.029763-0.0375710.160000-0.0240510.586445-0.0240510.586445.画出解 y1,y2 有,IV. 解洛伦兹方程方程如下,使用不同的初始值,观察差别dx10x10 y

18、,dtdy28 xy xz,dtdz8xy.dt3 z分别使用初值 x0 , y0 , z0 5,5,5, x0 , y0 , z0 5.001,5,5解查看附件我们查看初始值和结束值。 x0 , y0 , z0 5,5,5 x0 , y0 , z0 5.001,5,5txyzxyz05555.001550.016.2015960.6576426.3873596.20241310.6585266.3877950.029.37401417.4526590.7163959.37497817.45400710.71778349.983.2582763.36921920.608133-7.008305

19、-12.89172411.71253449.993.5494584.58850818.66144-10.450006-18.17170016.666380150.004.3004856.27903317.322649-14.303620-21.25238326.374359我们发现尽管初值仅有很小的区别,但是终值有的巨大的差别(与0.001 相比)。.初值为 x0 , y0 , z0 5,5,5画出 yz,xz,xy 有,.初值为 x0 , y0 , z0 5.001,5,5画出 yz,xz,xy 有,.V. 边值问题我们考虑这样一个方程.y (t1)y 2y(1t 2 )e t , 0t1y

20、(0)1; y(1)3.14使用 3 中代码求解有详细答案参看附件。我们看看几个均分点的值ty(t) 打靶法y(t) 差分法0.01.0000001.0000000.11.2392241.2392240.31.7030171.7030170.52.1442612.1442610.72.5609032.5609040.92.9528452.9528451.03.1400003.140000在算法上,打靶法计算量明显高于差分法,但是打靶法具有更高的普适性。在进行,有解析解的方程求解时,发现在步长相同时,差分法具有更高的精度。画出解的图有,Shooting 解法.有限差分解法End.代码:文件 ma

21、in_ode.cpp#include #include #include #include ode.h/#include ./array.hvoid free2DArray(double *a, int m)int i;for( i=0; im; i+ )free(ai);free(a);/ y= f(t,y), fun = f(t,y)double fun(double t,double y)return exp(t)/y;.void funv1(double t,double y,double fv)/ fv0= y0 + 2.*y1; /fv1=3*y0 + 2.*y1;/ Lotka-

22、Volterra equationfv0= y0 - y0*y1 - 0.1 *y0*y0;fv1= y0*y1 - y1 - 0.05*y1*y1;void funv2(double t,double y,double fv)/ y=x*x+x+1 fv0= y1;fv1= 4.*y0 - 4.*t*t - 4.*t - 2.;void funv3(double t, double y, double fv)fv0 = y1;fv1 = -278.28 / 0.15*y0 + 110.57 / 0.15*y2;fv2 = y3;fv3 = -278.28 / 0.15*y2 + 110.57

23、 / 0.15*y0;void funv4(double t, double y, double fv)fv0 = y1;fv1 = -(t + 1.)*y1 + y0 + (1. - t*t)*exp(-t);double pfun(double t)return -(t+1.);double qfun(double t)return 1.;double rfun(double t)return (1. - t*t)*exp(-t);/ -4.*t*t - 4.*t - 2.;void funvLorenz(double t,double yv,double fv)double x=yv0,

24、 y=yv1, z=yv2;fv0= 10.*(-x+y);fv1= 28.*x - y - x*z;fv2= -8./ 3.*z + x*y;.int main( int argc, char *argv )int i,M;double a = 0, b = 0;FILE *fp;double t0=0.,y0=2., tn=5., *yv,*yv2, *yMa, *yFD, yv02=2.,1., yvLorenz3=5.,5.,5.; double yv34 = 0., 1., 0., 1. ;/ exact solution: y2 = 2*exp(x)+2/ 1st order OD

25、EM=21;yv = RungeKutta_Heum( fun, t0, y0, tn, M);printf(y(5.)=%16.12f, %16.12f n, yvM-1, fabs(yvM-1-sqrt(2.*exp(5.)+2.); free(yv);M=21;yv2= RungeKutta4th( fun, t0, y0, tn, M);printf(y(5.)=%16.12f, %16.12f n, yv2M-1, fabs(yv2M-1-sqrt(2.*exp(5.)+2.);free(yv2);/ ODE systemyMa = RKSystem4th( funv1, 2, 0.

26、, yv0, 30., 1000);/*yv00 = 21.;yv01 = -9.;yMa = RKSystem4th( funv2, 2, -5., yv0, 5., 3001);*/printf( y130=%f, y230=%f n, yMa9990,yMa9991);/*printf(erry1=%f,erry2=%f, 4. * exp(4.) + 2. * exp(-1.) - yMa990, 6. * exp(4.) - 2.*exp(-1.) -yMa991);printf(erry1=%f,erry2=%f, 31 - yMa30000, 11 - yMa30001);*/

27、free2DArray(yMa,100);yMa = RKSystem4th( funv1, 2, 0., yv0, 30., 1000);fp=fopen(lv.dat,w+);for(i=0;i1000;i+)fprintf(fp,%ft %fn,yMai0,yMai1);fclose(fp);free2DArray(yMa,1000);yMa = RKSystem4th(funv3, 4, 0., yv3, 0.2, 11);fp = fopen(fv3.dat, w+);for (i = 0; i11; i+)fprintf(fp,%ft%ft%ft%ft%fn,0.02*i,yMai

28、0,yMai1,yMai2,yMai3);fclose(fp);.free2DArray(yMa, 11);/ Lorenz equM= 1001;yMa = RKSystem4th( funvLorenz, 3, 0., yvLorenz, 50., M);fp = fopen(Lorenz01.dat,w+);for(i=0;iM;i+)fprintf(fp,%ft %ft %fn, yMai0,yMai1,yMai2);fclose(fp);M = 1001;yvLorenz0 = 5.001;yMa = RKSystem4th(funvLorenz, 3, 0., yvLorenz,

29、50., M);fp = fopen(Lorenz02.dat, w+);for (i = 0; iM; i+)fprintf(fp, %ft %ft %fn, yMai0, yMai1, yMai2); fclose(fp);/ high order ODE/ BVPM = 101;t0 = 0.;tn = 1.;a = 1.;b = 3.14;yMa = BVP_Shooting(funv4, t0, a, tn, b, M);fp=fopen(Shoot.dat,w+);for(i=0;iM;i+)fprintf(fp, %ft %fn, t0 + (tn - t0) / (M-1) *

30、i, yMai0);fclose(fp);free2DArray(yMa,M);/BVP FDM = 101;t0 = 0.;tn = 1.;a = 1.;b = 3.14;yFD = BVP_FD(pfun, qfun, rfun, t0, a, tn, b, M);fp = fopen(yFD.dat, w+);for (i = 0; iM; i+)fprintf(fp, %ft %fn, t0 +(tn-t0)/(M-1)*i, yFDi);fclose(fp);free(yFD);return 0;.文件 ode.cpp#include #include ode.h#include #

31、include /#include ./array.hdouble* RungeKutta_Heum( double fun(double,double), double t0, double y0, double tn, int M)/y(t+h)=y(t)+h/ 2*(f(t,y)+f(t+h,y+hf(t,y)double h = (tn - t0) / (M-1);double t = t0;/double y100 = 0 ;double *y;y = (double *)malloc(M * sizeof(double);int i = 0;y0 = y0;for (i = 0;

32、i M-1; i+)yi+1 = yi + h / 2 * (fun(t, yi) + fun(t + h, yi + h*fun(t, yi);t = t + h;return y;/* double* RungeKutta_EulerCauchy( double fun(double,double), double a, double b, double y0, int M) */double* RungeKutta4th( double fun(double,double), double t0, double y0, double tn, int M)double h = (tn -

33、t0) / (M - 1);double t = t0;/double y100 = 0 ;double *y;y = (double *)malloc(M * sizeof(double);int i = 0;y0 = y0;for (i = 0; i M-1; i+)yi + 1 = yi + h / 6 * (fun(t, yi) + 2 * fun(t + h / 2, yi + h / 2 * fun(t, yi) + 2 * fun(t + h / 2, yi + h / 2 * fun(t + h / 2, yi + h / 2 * fun(t, yi) + fun(t + h,

34、 yi+h*fun(t + h / 2, yi + h / 2 * fun(t + h / 2, yi + h / 2 * fun(t,yi);t = t + h;.return y;double* RKSystem4th( void fun(double,double,double ), int N, double t0, double y00,double tn, int M)double h = (tn - t0) / (M - 1);double t = t0;/double y100 = 0 ;double *y;double *dy;double *tempdy;y = (double *

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论