/* intégration du mouvement du pendule par Runge-Kutta 4
 * version minimaliste
 * compiler/executer comme suit:
 *   javac Pendule_rk4_mini
 *   java Pendule_rk4_mini > pendule.data
 * 2008 Adrian Daerr, Univ Paris Diderot
 * domaine public
 */

import static java.lang.Math.*;

public class Pendule_rk4_mini {

    public static void main(String args[]) {
        final double tfinal=50.0, dt=0.05;
        double t=0.0;
        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
            System.out.println(""+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;
            // ce programme contient des traces d'Omega3 !
            domega3 = -sin(theta_int);

            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++;
        }
    }

}