48const double FGRungeKutta::RealLimit = 1e30;
60 h = (x_end - x_start)/intervals;
61 safer_x1 = x1 -
h*1e-6;
80bool FGRungeKutta::sane_val(
double x)
83 if ( x < RealLimit && x > -RealLimit )
return true;
106 cout << x <<
" " << y << endl;
107 y = approximate(x,y);
112 cout << x <<
" " << y << endl;
129double FGRK4::approximate(
double x,
double y)
138 y +=
h/6.0 * ( k1 + 2.0*k2 + 2.0*k3 + k4 );
149const double FGRKFehlberg::A2[] = { 0.0, 1.0/4.0 };
150const double FGRKFehlberg::A3[] = { 0.0, 3.0/32.0, 9.0/32.0 };
151const double FGRKFehlberg::A4[] = { 0.0, 1932.0/2197.0, -7200.0/2197.0, 7296.0/2197.0 };
152const double FGRKFehlberg::A5[] = { 0.0, 439.0/216.0, -8.0, 3680.0/513.0, -845.0/4104.0 };
153const double FGRKFehlberg::A6[] = { 0.0, -8.0/27.0, 2.0, -3544.0/2565.0, 1859.0/4104.0, -11.0/40.0 };
155const double FGRKFehlberg::C[] = { 0.0, 0.0, 1.0/4.0, 3.0/8.0, 12.0/13.0, 1.0, 1.0/2.0 };
157const double FGRKFehlberg::B[] = { 0.0, 16.0/135.0, 0.0, 6656.0/12825.0, 28561.0/56430.0, -9.0/50.0, 2.0/55.0 };
158const double FGRKFehlberg::Bs[] = { 0.0, 25.0/216.0, 0.0, 1408.0/2565.0, 2197.0/4104.0, -1.0/5.0, 0.0 };
165double FGRKFehlberg::approximate(
double x,
double y)
168 double k1,k2,k3,k4,k5,k6, as;
186 as =
h*(A3[1]*k1 + A3[2]*k2);
189 as =
h*(A4[1]*k1 + A4[2]*k2 + A4[3]*k3);
192 as =
h*(A5[1]*k1 + A5[2]*k2 + A5[3]*k3 + A5[4]*k4);
195 as =
h*(A6[1]*k1 + A6[2]*k2 + A6[3]*k3 + A6[4]*k4 + A6[5]*k5);
199 y5_val = y +
h * (
B[1]*k1 +
B[3]*k3 +
B[4]*k4 +
B[5]*k5 +
B[6]*k6);
200 y4_val = y +
h * (Bs[1]*k1 + Bs[3]*k3 + Bs[4]*k4 + Bs[5]*k5);
202 abs_err = fabs(y4_val-y5_val);
207 if (abs_err > epsilon) {
208 est_step = sqrt(sqrt(epsilon*
h/abs_err));
215 if (shrink_avail>0 && est_step<
h) {
Minimalistic implementation of some Runge-Kutta methods.
virtual double pFunc(double x, double y)=0
FGRungeKuttaProblem * pfo
double evolve(double y_0, FGRungeKuttaProblem *pf)
int init(double x_start, double x_end, int intervals=4)