對(duì)于常微分方程的數(shù)值解法,四階Runge—Kutta是一個(gè)常用的方法,其精度相對(duì)較高,實(shí)現(xiàn)起來簡單,因而有廣泛應(yīng)用。
下面我們簡要討論一下。
設(shè)一階常微分方程:
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)) */
#include <iostream>
#include <cmath>
using namespace std;

class RK


{
private:
double k1,k2,k3,k4;
double h,b,u,a;
public:

void seth(double l=0)
{h=l;} //設(shè)步長
void setf(double xa=0,double xb=0,double y=0) //設(shè)初值和范圍(xa,xb)

{
b=xb;
a=xa;
u=y;
}
double f(double t,double u) //函數(shù)值,修改它以適應(yīng)各自需要

{
//函數(shù)設(shè)定
double f=u-2*t/u;
return f;
}

/**//*---------------------------*/
void dork() //R-K 主函數(shù)

{
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;
cout<<u<<endl;
}

}
};

void main()


{
RK my;
my.seth(0.1);
my.setf(0,1,1);
my.dork();
}


該程序?qū)?shù)據(jù)直接進(jìn)行顯示,如要畫圖,可以加入幾行,輸出數(shù)據(jù),然后進(jìn)行畫圖。