00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00033 #include "RungeKutta4IvpOdeSolver.hpp"
00034 #include "AbstractIvpOdeSolver.hpp"
00035 #include "AbstractOdeSystem.hpp"
00036 #include "OdeSolution.hpp"
00037
00038
00039 #include <vector>
00040
00041
00054 void RungeKutta4IvpOdeSolver::CalculateNextYValue(AbstractOdeSystem* pAbstractOdeSystem,
00055 double timeStep,
00056 double time,
00057 std::vector<double>& currentYValues,
00058 std::vector<double>& nextYValues)
00059 {
00060
00061
00062
00063
00064 const unsigned num_equations = pAbstractOdeSystem->GetNumberOfStateVariables();
00065
00066 if (num_equations != k1.size())
00067 {
00068 k1.resize(num_equations);
00069 k2.resize(num_equations);
00070 k3.resize(num_equations);
00071 k4.resize(num_equations);
00072 yki.resize(num_equations);
00073 }
00074
00075 std::vector<double>& dy = nextYValues;
00076
00077 pAbstractOdeSystem->EvaluateYDerivatives(time, currentYValues, dy);
00078 for (unsigned i=0;i<num_equations; i++)
00079 {
00080 k1[i]=timeStep*dy[i];
00081 yki[i] = currentYValues[i] + 0.5*k1[i];
00082 }
00083
00084 pAbstractOdeSystem->EvaluateYDerivatives(time+0.5*timeStep, yki, dy);
00085 for (unsigned i=0;i<num_equations; i++)
00086 {
00087 k2[i]=timeStep*dy[i];
00088 yki[i] = currentYValues[i] + 0.5*k2[i];
00089 }
00090
00091 pAbstractOdeSystem->EvaluateYDerivatives(time+0.5*timeStep, yki, dy);
00092 for (unsigned i=0;i<num_equations; i++)
00093 {
00094 k3[i]=timeStep*dy[i];
00095 yki[i] = currentYValues[i] + k3[i];
00096 }
00097
00098 pAbstractOdeSystem->EvaluateYDerivatives(time+timeStep, yki, dy);
00099 for (unsigned i=0;i<num_equations; i++)
00100 {
00101 k4[i]=timeStep*dy[i];
00102 nextYValues[i] = currentYValues[i] + (k1[i]+2*k2[i]+2*k3[i]+k4[i])/6.0;
00103 }
00104 }