
Sistema de ecuaciones diferenciales de segundo orden
Resolver el sistema de ecuaciones diferenciales de segundo orden
La constante J se escribe
En el instante t=0, la nave espacial parte de la posición
x0=-rT+r·cosθ
y0= r·sinθ
Con velocidad inicial
v0x=-(v+Δv)·sinθ
v0y=(v+Δv)·cosθ
Donde Δv es el incremento de velocidad proporcionado por los cohetes de la nave de forma casi instantánea
public class Sistema extends RungeKutta{ final double rT=0.73095; final double rL=59.55162; final double w=0.23072; // wTierra-Luna*un día final double cL=141.39403; final double cT=11519.56835; pulic Sistema(double h){ super(h); } public double f(double x, double y, double vx, double vy, double t){ double dL=Math.sqrt((x-rL)*(x-rL)+y*y); double dT=Math.sqrt((x+rT)*(x+rT)+y*y); double z=2*w*vy+w*w*x-cL*(x-rL)/(dL*dL*dL)-cT*(x+rT)/(dT*dT*dT); return z; } public double g(double x, double y, double vx, double vy, double t){ double dL=Math.sqrt((x-rL)*(x-rL)+y*y); double dT=Math.sqrt((x+rT)*(x+rT)+y*y); double z=-2*w*vx+w*w*y-cL*y/(dL*dL*dL)-cT*y/(dT*dT*dT); return z; } public double energia(double x, double y, double vx, double vy){ double dL=Math.sqrt((x-rL)*(x-rL)+y*y); double dT=Math.sqrt((x+rT)*(x+rT)+y*y); double z=(vx*vx+vy*vy)/2-(cL/dL+cT/dT)-w*w*(x*x+y*y)/2; return z; } } //Objeto de la clase Sistema void setNuevo(double v0, double ang){ double x0=-rT+rNave*Math.cos(ang); double y0=rNave*Math.sin(ang); double v0x=-(rNave*wNave+v0*3600*24/6.37e6)*Math.sin(ang); double v0y=(rNave*wNave+v0*3600*24/6.37e6)*Math.cos(ang); estado=new Estado(0.0, x0, y0, v0x, v0y); sis=new Sistema(calculaPaso()); eInicial=oscilador.energia(x0, y0, v0x, v0y); } double calculaPaso(){ double dL=Math.sqrt((estado.x-rL)*(estado.x-rL)+estado.y*estado.y); double dT=Math.sqrt((estado.x+rT)*(estado.x+rT)+estado.y*estado.y); double distMed=Math.sqrt(dT*dL); double dt=0.0005*Math.pow((distMed/(60.282*0.1)), 1.5); //para un día return dt; } void mover(){ sis.resolver(estado); sis.setPaso(calculaPaso()); double energia=oscilador.energia(estado.x, estado.y, estado.vx, estado.vy); error=Math.abs((energia-eInicial)*100/eInicial); if(error>1.0){ //se para ; } } } |
