00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include "RungeKutta4Solver.h"
00013
#include <OpenCAL/ODESource.h>
00014
using namespace OpenCAL;
00015
00016
using namespace std;
00017
00018
00019
00020
00021
00022
00023 RungeKutta4Solver::RungeKutta4Solver()
00024 {
00025 }
00026
00027 RungeKutta4Solver::~RungeKutta4Solver()
00028 {
00029 }
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00054 void RungeKutta4Solver::solve(
float stepSize,
ODESource *source)
00055 {
00062
const float oneThird = 1.0f / 3.0f;
00063
const float oneSixth = 1.0f / 6.0f;
00064
00065 source->
fillState();
00066 source->
fillDerivative();
00067
00068
PhaseSpace &state = *(source->
getState());
00069
PhaseSpace &deriv = *(source->
getDerivative());
00070
00071
00072
PhaseSpace x0 = state;
00073
00074
00075
00076
PhaseSpace k1 = stepSize * deriv;
00077
00078
00079 state.
add(k1, 0.5f);
00080 source->
fromState();
00081 source->
fillDerivative();
00082
PhaseSpace k2 = stepSize * deriv;
00083
00084
00085 state = x0;
00086 state.
add(k2, 0.5f);
00087 source->
fromState();
00088 source->
fillDerivative();
00089
PhaseSpace k3 = stepSize * deriv;
00090
00091
00092 state = x0;
00093 state += k3;
00094 source->
fromState();
00095 source->
fillDerivative();
00096
PhaseSpace k4 = stepSize * deriv;
00097
00098
00099
00100
00101
00102
00103
00104
00105 state = x0;
00106 state.
add(k1, oneSixth);
00107 state.
add(k2, oneThird);
00108 state.
add(k3, oneThird);
00109 state.
add(k4, oneSixth);
00110
00111
00112 source->
fromState();
00113 }