00001 #pragma ident "$Id: RungeKutta4.cpp 70 2006-08-01 18:36:21Z ehagen $"
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 #include "RungeKutta4.hpp"
00028
00029
00030
00031
00032
00033
00034 void gpstk::RungeKutta4::integrateTo (double nextTime,
00035 double stepSize)
00036 {
00037 if (stepSize == 0)
00038 stepSize = nextTime - currentTime;
00039
00040 bool done = false;
00041
00042 while (!done)
00043 {
00044
00045 double ctPlusDeltaT = currentTime + stepSize;
00046 double ctPlusHalfDeltaT = currentTime + (stepSize * .5);
00047
00048
00049 k1 = stepSize * derivative(currentTime, currentState, k1);
00050 tempy = currentState + (.5 * k1);
00051
00052
00053 k2 = stepSize * derivative(ctPlusHalfDeltaT, tempy, k2);
00054 tempy = currentState + (.5 * k2);
00055
00056
00057 k3 = stepSize * derivative(ctPlusHalfDeltaT, tempy, k3);
00058
00059
00060 k4 = stepSize * derivative(ctPlusDeltaT, tempy, k4);
00061 currentState += (k1 + 2. * (k2 + k3) + k4) / 6. ;
00062
00063
00064 if (fabs(currentTime + stepSize - nextTime) < teps)
00065 done = true;
00066
00067
00068
00069 if ((currentTime + stepSize) > nextTime)
00070 stepSize = (nextTime - currentTime);
00071
00072 currentTime += stepSize;
00073 }
00074
00075 currentTime = nextTime;
00076 }
00077
00078 void gpstk::RungeKutta4::integrateTo (double nextTime,
00079 Matrix<double>& error,
00080 double stepSize)
00081 {
00082 double deltaT = nextTime - currentTime;
00083
00084
00085 double savedTime = currentTime;
00086 gpstk::Matrix<double> savedState = currentState;
00087
00088
00089 integrateTo(currentTime + (deltaT * 0.5), stepSize);
00090 integrateTo(nextTime, stepSize);
00091
00092
00093 gpstk::Matrix<double> twoStepState = currentState;
00094
00095
00096 currentTime = savedTime;
00097 currentState = savedState;
00098
00099
00100 integrateTo(nextTime, stepSize);
00101 gpstk::Matrix<double> oneStepState = currentState;
00102
00103 error = oneStepState - twoStepState;
00104
00105 currentState = twoStepState + (twoStepState - oneStepState) / 15.0;
00106
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120