
Procedimiento numérico
Ecuaciones diferenciales de segundo orden
- Primera etapa
Con las condiciones iniciales: en el instante t=0, θ=θ0, dθ/dt=v0/(Lcos θ0)
- Segunda etapa
Con las condiciones iniciales: en el instante t=tc, θ=θc, dθ/dt=v0/(Lcos θc)
public class Sistema extends RungeKutta{ double lonVarilla; double v0; public Sistema(double lonVarilla, double v, double h){ super(h); this.lonVarilla=lonVarilla; this.v0=v; } public double f(double x, double v, double t){ double coseno=Math.cos(x); return (Math.sin(x)*v0*v0/(coseno*coseno*coseno*lonVarilla*lonVarilla)); } } public class Sistema1 extends RungeKutta{ double lonVarilla; public Sistema1(double lonVarilla, double h){ super(h); this.lonVarilla=lonVarilla; } public double f(double x, double v, double t){ return (14.7*Math.sin(x)/lonVarilla); } } public class MiCanvas extends Canvas { void setNuevo(int ang, double velocidad){ this.angInicial=ang*Math.PI/180; this.velocidad=velocidad; double wIni=velocidad/(lonVarilla*Math.cos(angInicial)); estado=new Estado(0.0, angInicial, wIni); angCritico=Math.PI/2; bPrimeraVez=false; if(velocidad*velocidad/(9.8*lonVarilla)>1.5){ sistema=new Sistema1(lonVarilla, dt); }else{ double temp=2*velocidad*velocidad/(3*9.8*lonVarilla); angCritico=Math.acos(Math.pow(temp, 1.0/3)); if(angInicial>angCritico){ sistema=new Sistema1(lonVarilla, dt); angCritico=Math.PI/2; } else sistema=new Sistema(lonVarilla, velocidad, dt); } } void mover(){ xExtremo=velocidad*estado.t; sistema.resolver(estado); if(estado.x>angCritico && !bPrimeraVez){ double tc=estado.t; double wC=velocidad/(lonVarilla*Math.cos(angCritico)); estado=new Estado(tc, angCritico, wC); sistema=new Sistema1(lonVarilla, dt); bPrimeraVez=true; } } } |
