二阶龙格库塔方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.结果为