Below my 4th order Runge-Kutta algorithm solves first order ODEs. I test it with wikipedia as an example here to solve:
\frac{dx}{dt} = tan(x) + 1
Unfortunately, this is a bit. I walked around for a long time, but I can not find a mistake. The answer should be t = 1.1 and x = 1.33786352224364362. The code below gives t = 1.1 and x = 1.42223.
#include <math.h>
#include <iostream>
#include <iomanip>
double x,t,K,K1,K2,K3,K4;
const double sixth = 1.0 / 6.0;
static double dx_dt(double t, double x){
return tan(x) + 1;
}
int main(int argc, const char * argv[]) {
double t_initial = 1.0;
double x_initial = 1.0;
double t_final = 1.1;
double dt = 0.025;
double halfdt = 0.5*dt;
while(t_initial < t_final){
double K1 = dt*dx_dt( t_initial, x_initial );
double K2 = dt*dx_dt( t_initial + halfdt, x_initial + halfdt*K1 );
double K3 = dt*dx_dt( t_initial + halfdt, x_initial + halfdt*K2 );
double K4 = dt*dx_dt( t_initial + dt, x_initial + dt*K3 );
x_initial += sixth*(K1 + 2*(K2 + K3) + K4);
std::cout << t_initial << std::setw(16) << x_initial << "\n";
t_initial += dt;
}
std::cout<<"----------------------------------------------\n";
std::cout << "t = "<< t_initial << ", x = "<< x_initial << std::endl;
}
source
share