四阶Runge-Kutta方法.docx
实验题目四阶Runge-Kutta方法班级:09医软一班小组成员:赵善飞09714057,翟增辉09714054负责算法编程实现局部马卫卫09714026负责数据输入输出程序和实验报告王燕09714040负责后期运行结果检验实验名称:利用四阶龙格-库塔方法求解微分方程的初值问题。实验目的:编写关于四阶龙格-库塔c+程序求解微分方程的初值问题。实验原理:一阶常微分方程初值问题的数值解法是近似计算中很重要的局部。常微分方程初值问题的数值解法是求方程6.1的解在点列鸠='I+优("=°/*)上的近似值L,这里儿是、"到土的步长,一般略去下标记为。常微分方程初值问题的数值解法一般分为两大类:1)单步法:这类方法在计算儿时,只用到""+K当和)'",即前一步的值。因此,在有了初值以后就可以逐步往下计算。典型方法如龙格-库塔(R-K)方法.(2)多步法:这类方法在计算y"÷'时,除用到与+1、乙和"以外,还要用上一式"=1,2,M;A°),即前面"步的值。典型方法如AdamS方法。经典的R-K方法是一个四阶的方法,它的计算公式是:”“=”+£(+2K2+2K,+K).=)<K2=f(xtl+g,y+I)6.2)=(j+p以+K2)Ki=f(x+h,yn+hKi)经过修改正的可用C+算法R-K四阶算法:开始程序设计流程Xa=O,xb=l,y=lC+程序如下:#include<iostream.h>classRKprivate:输入步长m值doublekl,k2,k3,k4;b=xb;a=xa;u=y;doublef=u-2*tu;doubleh,b,u,a;public:voidseth(doublel=0)h=l;)设步长voidsetf(doublexa=0,doublexb=0,doubley=0)设初值和范围(xa,xb)b=xb;a=xa;u=y;doublef(doublet,doubleU)函数值,可根据你所求的不同的方程进行修改函数设定doublef=-u*(l÷t*u);returnf;voiddork()/R-K主函数for(intcount=0;count<(b-a)/h;count+)k1=f(a+count*h,u);k2=f(a+count*h+h2,u÷h*kl2);k3=f(a+count*h+h2,u+h*k22);k4=f(a+count*h+h,u+h*k3);u=u+h*(k1÷2*k2+2*k3+k4)6;COUt<<"第"<<count<<"次迭代;cout<<"u=',<<u<<"kl="<<kl<<"k2="<<k2<<"k3="<<k3<<"k4="<<k4<<endl;;voidmain()RKmy;doublem;COlIt<<”请输入步长值:,'<<endl;cin>>m;my.seth(m);my.setf(OJJ);my.dork();当步长为0.2时,U的值与例题中y的值相等,故程序正确。