经典Runge-Kutta方法和显式四阶Adams方法的比较和上机实现。
#include<stdio.h> #include<math.h> #define M 200 float m; float h;
//因为用到 fabs()和 exp()函数,加上函数预处理名。 //申请两个大容量的数组用来存放两种方法每一步求的 y 值 //将 m 和 h 都设为全局变量,后面的分函数也要用到。
float RungeKutta(float y) { float k1,k2,k3,k4; k1=m*y; k2=m*(y+h*k1/2); k3=m*(y+h*k2/2); k4=m*(y+h*k3); y=y+(h/6)*(k1+2*k2+2*k3+k4); return y; } void main() { int n,i; float y[M],Y[M];
//经典 Runge-kutta 方法的函数,精髓。
//主函数
//申请两个数组
float y0,e0,e1; printf("请输入区间等分数 n 值和参数值 m:"); scanf("%d,%f",&n,&m); h=1/float(n); y[0]=1.0,Y[0]=1.0; for(i=1;i<=n;i++) { if(i<=3) 用 { //龙塔方法求出。 //使用显性 4 阶 Adams 方法只能从 y4 开始求起,故 y0 到 y3 都 //赋初始值。 //按照区间等分数,循环执行以下语句 n 次
y[i]=Rung
eKutta(y[i-1]); Y[i]=RungeKutta(Y[i-1]); } else {