#include #include static double h=1.0/64; double rk2step(double x,double y){ double k1=h*f(x,y); return y+(k1+h*f(x+h,y+k1))/2; } // Runge-Kutta Order Four from page 288 double rk4step(double t,double w){ double k1=h*f(t,w); double k2=h*f(t+h/2,w+k1/2); double k3=h*f(t+h/2,w+k2/2); double k4=h*f(t+h,w+k3); return w+(k1+2*(k2+k3)+k4)/6; } int main(){ double x0=0,xn=10; double y0=2,tol=1e-6; double x=x0,y=y0,esofar=0; for(;;){ if(x+h>xn) h=xn-x; double t1=rk2step(x,y); double t2=rk4step(x,y); double epsilon=(xn-x)/h*(tol-esofar); if(fabs(t1-t2)>epsilon){ h/=2; } else { y=t2; x+=h; esofar+=fabs(t1-t2); } if(x==xn) break; } return 0; }