二阶龙格库塔方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2012-2013(1)专业课程实践论文二阶Runge-Kutta方法

董文峰,0818180123,R数学08-1班

一、算法理论

由改进的Euler 方法得到:

()),(),(2

1

12

1211K y h x hf K y x hf K K K y y i i i i i i ++==++

=

⎪⎩⎪⎨⎧+

凡满足条件式有一簇形如上式的计算格式,这些格式统称为二阶龙格—库塔格式。因此改进的欧拉格式是众多的二阶龙格—库塔法中的一种特殊格式。

若取1,0,2

1

21212====c c b a ,就是另一种形式的二阶龙格 - 库塔公式。

⎪⎪⎩⎪

⎪⎨⎧

++==+=+)

2,2()

,(12121K h

y h x f K y x f K hK y y n n n n n n (1)

此计算公式称为变形的二阶龙格—库塔法。

二级龙格-库塔方法是显式单步式,每前进一步需要计算两个函数值。由上面的讨论可知,适当选择四个参数y0,a,b,n ,可使每步计算两次函数值的二阶龙格-库塔方法达到二阶精度。下面以式子(1)为依据利用VC++6.0编译程序进行问题的求解。

二、算法框图

三、算法程序

#include

#include

/*n表示几等分,n+1表示他输出的个数*/

int RungeKutta(double y0,double a,double b,int n,double *x,double *y,double (*function)(double,double))

{

double h=(b-a)/n,k1,k2;

int i;

x[0]=a;

y[0]=y0;

for(i=0;i

{

x[i+1]=x[i]+h;

k1=function(x[i],y[i]);

k2=function(x[i]+h/2,y[i]+h*k1/2);

y[i+1]=y[i]+h*k2;

}

return 1;

}

double function(double x,double y)

{

return y-2*x/y;

}

int main()

{ int i;

double x[6],y[6];

printf("用二阶龙格-库塔方法\n"); RungeKutta(1,0,1,5,x,y,function);

for( i=0;i<6;i++)

printf("x[%d]=%f,y[%d]=%f\n",i,x[i],i,y[i]); return 1;

}

四、算法实现

例1. 取h=0.2,用二阶Runge-Kutta 公式求解⎩⎨⎧=<<+='1)0(1

0,y x y x y

解:1.将程序中的return y-2*x/y 改成 return x+y

2.输入y0,a,b,n 分别为 1,0,1,5

3.结果为

例2. 取h=0.2,用二阶Runge-Kutta 公式求解⎩⎨⎧=<<+='1)0(1

0),1/(3y x x y y

解:1. 将程序中的return y-2*x/y 改成 return 3*y/(1+x)

2.输入y0,a,b,n 分别为1,0,1,5

3.结果为

相关文档
最新文档