四阶Runge-Kutta法

王朝c/c++·作者佚名  2006-01-06
窄屏简体版  字體: |||超大  

一阶常微分方程:

u'=f(t,u) a<t<b

u(t(0))=u(0)

Runge-Kutta非线性高阶单步法,p阶R-K法的整体阶段误差为O(h^p)

R-K四阶算法:

u(i+1)=u(i)+h*(k1+3*k2+3*k3+k4)/8

k1=f(t(i),u(i))

k2=f(t(i+h/3),u(i+h*k1/3))

k3=f(t(i+h/3),u(i+h*k2/3))

k4=f(t(i+h),u(i+h*k3))

四阶程序如下:

class RK{

private:

double k1,k2,k3,k4;

double h,b,u,a;

public:

void seth(double l=0){h=l;} //设步长

void setf(double xa=0,double xb=0,double y=0) //设初值和范围(xa,xb)

{

b=xb;

a=xa;

u=y;

}

double f(double t,double u) //函数值,修改它以适应各自需要

{

//函数设定

double f=u-2*t/u;

return f;

}

void dork() //R-K 主函数

{

for(int count=0;count<(b-a)/h;count++)

{

k1=f(a+count*h,u);

k2=f(a+count*h+h/3,u+h*k1/3);

k3=f(a+count*h+2*h/3,u-h*k1/3+h*k2);

k4=f(a+count*h+h,u+h*k1-h*k2+h*k3);

u=u+h*(k1+3*k2+3*k3+k4)/8;

count<<u<<endl;

}

}

};

void main()

{

RK my;

my.seth(0.1);

my.setf(0,1,1);

my.dork();

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航