Anterior

Procedimientos numéricos

Sistema de dos ecuaciones diferenciales de segundo orden

Resolver el sistema de dos ecuaciones diferenciales de segundo orden

(1+μ) d 2 r d t 2 =r ( dθ dt ) 2 +g(cosθμ) r d 2 θ d t 2 +2 dr dt dθ dt +gsinθ=0

con las condiciones iniciales:en el instante t=0, la posición inicial es r=r0, θ=θ0, y las componentes de la velocidad inicial son

( d r d t ) 0 r 0 ( d θ d t ) 0

Energía

e = 1 2 μ ( d r d t ) 2 + 1 2 ( ( d r d t ) 2 + r 2 ( d θ d t ) 2 ) + g r ( μ cos θ )

public class Oscilador extends RungeKutta{
    double mu; 
    public Oscilador(double mu, double h){
      super(h);
      this.mu=mu;
    }
    public double f(double x, double y, double vx, double vy, double t){
         double z=(x*vy*vy+9.8*(Math.cos(y)-mu))/(1+mu);
         return z;
    }
    public double g(double x, double y, double vx, double vy, double t){
         double z=-(2*vx*vy+9.8*Math.sin(y))/x;
         return z;
    }
    public double energia(double x, double y, double vx, double vy){
       double z=mu*vx*vx/2+(vx*vx+x*x*vy*vy)/2+9.8*x*(mu-Math.cos(y));
       return z;
    }
}
//Objetos de la clase Oscilador Estado estado=new Estado(0.0, x0, y0, V0x, V0y); Oscilador oscilador=new Oscilador(mu, 0.005*paso[iPaso]); eInicial=oscilador.energia(x0, y0, V0x, V0y); //rutina que calcula la trayectoria paso a paso oscilador.resolver(estado); double energia=oscilador.energia(estado.x, estado.y, estado.vx, estado.vy); double error=Math.abs((energia-eInicial)*100/eInicial); if(error>1.0 || estado.x<0.0){ //se detiene }
Anterior