/* intégration du mouvement du pendule par Runge-Kutta 4
 * version minimaliste
 * compiler/executer comme suit:
 *   gcc -Wall pendule_rk4_mini.c -lm -o pendule_rk4_mini
 *   ./pendule_rk4_mini > pendule.data
 * 2008 Adrian Daerr, Univ Paris Diderot
 * domaine public
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void) {
  double t=0.0, tfinal=50.0, dt=0.05;
  double theta=0.0, omega=1.99;// conditions initiales
  double theta_int, omega_int;
  double dtheta1, domega1;
  double dtheta2, domega2;
  double dtheta3, domega3;
  double dtheta4, domega4;
  int n=0;
  while (t<tfinal) {
    t = n*dt;

    // afficher l'état du système
    printf("%f %f %f\n",t,theta,omega);

    // integrer d'un pas de temps
    dtheta1 = omega;
    domega1 = -sin(theta);

    theta_int = theta + 0.5*dt*dtheta1;
    omega_int = omega + 0.5*dt*domega1;

    dtheta2 = omega_int;
    domega2 = -sin(theta_int);

    theta_int = theta + 0.5*dt*dtheta2;
    omega_int = omega + 0.5*dt*domega2;

    dtheta3 = omega_int;
    domega3 = -sin(theta_int);// ce programme contient des traces d'Omega3 !

    theta_int = theta + dt*dtheta3;
    omega_int = omega + dt*domega3;

    dtheta4 = omega_int;
    domega4 = -sin(theta_int);

    theta = theta + dt*(dtheta1 + 2*dtheta2 + 2*dtheta3 + dtheta4)/6;
    omega = omega + dt*(domega1 + 2*domega2 + 2*domega3 + domega4)/6;

    n++;
  }
  return EXIT_SUCCESS;
}