37#include "FGRungeKutta.h"
38#include "input_output/FGLog.h"
46const double FGRungeKutta::RealLimit = 1e30;
52FGRungeKutta::~FGRungeKutta() { };
54int FGRungeKutta::init(
double x_start,
double x_end,
int intervals)
58 h = (x_end - x_start)/intervals;
59 safer_x1 = x1 - h*1e-6;
64 status &= eFaultyInit;
78bool FGRungeKutta::sane_val(
double x)
81 if ( x < RealLimit && x > -RealLimit )
return true;
87double FGRungeKutta::evolve(
double y_0, FGRungeKuttaProblem *pf)
98 if (!sane_val(y)) { status &= eMathError; }
103 FGLogging log(LogLevel::DEBUG);
105 log << x <<
" " << y <<
"\n";
106 y = approximate(x,y);
107 if (!sane_val(y)) { status &= eMathError; }
111 log << x <<
" " << y <<
"\n";
128double FGRK4::approximate(
double x,
double y)
132 k1 = pfo->pFunc(x , y );
133 k2 = pfo->pFunc(x + h05, y + h05*k1);
134 k3 = pfo->pFunc(x + h05, y + h05*k2);
135 k4 = pfo->pFunc(x + h , y + h *k3);
137 y += h/6.0 * ( k1 + 2.0*k2 + 2.0*k3 + k4 );
148const double FGRKFehlberg::A2[] = { 0.0, 1.0/4.0 };
149const double FGRKFehlberg::A3[] = { 0.0, 3.0/32.0, 9.0/32.0 };
150const double FGRKFehlberg::A4[] = { 0.0, 1932.0/2197.0, -7200.0/2197.0, 7296.0/2197.0 };
151const double FGRKFehlberg::A5[] = { 0.0, 439.0/216.0, -8.0, 3680.0/513.0, -845.0/4104.0 };
152const double FGRKFehlberg::A6[] = { 0.0, -8.0/27.0, 2.0, -3544.0/2565.0, 1859.0/4104.0, -11.0/40.0 };
154const 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 };
156const 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 };
157const 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 };
162FGRKFehlberg::~FGRKFehlberg() { };
164double FGRKFehlberg::approximate(
double x,
double y)
167 double k1,k2,k3,k4,k5,k6, as;
180 k1 = pfo->pFunc(x , y );
183 k2 = pfo->pFunc(x + C[2]*h , y + as );
185 as = h*(A3[1]*k1 + A3[2]*k2);
186 k3 = pfo->pFunc(x + C[3]*h , y + as );
188 as = h*(A4[1]*k1 + A4[2]*k2 + A4[3]*k3);
189 k4 = pfo->pFunc(x + C[4]*h , y + as );
191 as = h*(A5[1]*k1 + A5[2]*k2 + A5[3]*k3 + A5[4]*k4);
192 k5 = pfo->pFunc(x + C[5]*h , y + as );
194 as = h*(A6[1]*k1 + A6[2]*k2 + A6[3]*k3 + A6[4]*k4 + A6[5]*k5);
195 k6 = pfo->pFunc(x + C[6]*h , y + as );
198 y5_val = y + h * ( B[1]*k1 + B[3]*k3 + B[4]*k4 + B[5]*k5 + B[6]*k6);
199 y4_val = y + h * (Bs[1]*k1 + Bs[3]*k3 + Bs[4]*k4 + Bs[5]*k5);
201 abs_err = fabs(y4_val-y5_val);
206 if (abs_err > epsilon) {
207 est_step = sqrt(sqrt(epsilon*h/abs_err));
214 if (shrink_avail>0 && est_step<h) {
Main namespace for the JSBSim Flight Dynamics Model.