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