/* From: "COMPUTATIONAL PHYSICS, 2nd Ed" by RH Landau, MJ Paez, and CC Bordeianu Copyright Wiley-VCH, 2007. Electronic Materials copyright: R Landau, Oregon State Univ, 2007; MJ Paez, Univ Antioquia, 2007; & CC Bordeianu, Univ Bucharest, 2007 Support by National Science Foundation */ // rk4.c: 4th order Runge-Kutta solution for harmonic oscillator #include #define N 2 // number of equations #define dist 0.1 // stepsize #define MIN 0.0 // minimum x #define MAX 10.0 // maximum x main() { double x, y[N]; int j; void runge4(double x, double y[], double step); // header double f(double x, double y[], int i); FILE *output; // save data in rk4.dat output= fopen("rk4.dat","w"); y[0]= 1.0; // initial position y[1]= 0.0; // initial velocity fprintf(output, "%f\t%f\n", x, y[0]); for (x= MIN; x <= MAX ; x += dist) { runge4(x, y, dist); fprintf(output, "%f\t%f\n", x, y[0]); // position vs. time } printf("data stored in rk4.dat\n"); fclose(output); } // -end of main program void runge4(double x, double y[], double step) { // rk subroutine double f(double x, double y[], int i); double h = step/2.0, // the midpoint t1[N], t2[N], t3[N], k1[N], k2[N], k3[N],k4[N]; // for Runge-Kutta int i; for (i = 0; i