public class RK4 { Vecteur vitesse; Vecteur pos; Vecteur force; float ressort; float deltaT; public RK4(Vecteur pos0,Vecteur vit0){ vitesse=vit0; pos=pos0; ressort=-100000.0f; deltaT=0.5f; } public void evoluer(){ //Runge-Kutta à l'ordre 4 Vecteur vprime1, pos2,vitesse2,vprime2, pos3,vitesse3,vprime3, pos4,vitesse4,vprime4; vprime1=kepler(pos); pos2=pos.ajouter(vitesse ,deltaT/2); vitesse2=vitesse.ajouter(vprime1, deltaT/2); vprime2=kepler(pos2); pos3=pos.ajouter(vitesse2 ,deltaT/2); vitesse3=vitesse.ajouter(vprime2, deltaT/2); vprime3=kepler(pos3); pos4=pos.ajouter(vitesse3 ,deltaT); vitesse4=vitesse.ajouter(vprime3, deltaT); vprime4=kepler(pos4); pos=pos.ajouter(Vecteur.comb(1/6.0f,vitesse.ajouter(vitesse4,1),1/3.0f,vitesse2.ajouter(vitesse3,1)),deltaT); vitesse=vitesse.ajouter(Vecteur.comb(1/6.0f,vprime1.ajouter(vprime4,1),1/3.0f,vprime2.ajouter(vprime3,1)),deltaT); } private Vecteur kepler(Vecteur position) { return position.mul(ressort/position.length3()); } /*Resolution point par point de l'équation différentielle du second ordre dpos2/dt2=kepler(pos,t); * * L'équation est transformée en une équation du premier degré : * En posant : posV=(pos, dpos/dt) * on obtient dposV/dt=(dpos/dt, kepler(pos,t)) * Il suffit donc de résoudre l'équation du premier degré: dposV/dt=keplerV(t, posV) où keplerV * associe à un couple (p,v) le couple (v,kepler(p,t)). Ainsi Runge-Kutta4, s'applique sans problème. * * Le code ci-dessus simplifie les répétitions d'objets induites par la réduction au premier ordre. * @author Alcys * * */ }