Procedimientos numéricos
Ecuaciones diferenciales de segundo orden
Fuerza de rozamiento proporcional a la velocidad
- Antes de agotarse el combustible
Condiciones iniciales: t=0, dx/dt=0, x=0
public class Particula extends RungeKutta{
double roza;
final double masaInicial=1000.0;
double tiempo;
double vEscape;
public Particula(double vEscape, double tiempo, double roza, double h){
super(h);
this.roza=roza;
this.tiempo=tiempo;
this.vEscape=vEscape;
}
public double f(double x, double v, double t){
double masa=masaInicial*Math.exp(-t/tiempo);
return (-roza*v/masa+vEscape/tiempo-9.8);
}
} |
- Después de agotarse el combustible
Condiciones iniciales: t=te, dx/dt=ve y x=xe
public class Particula1 extends RungeKutta{
double roza;
final double masaFinal=300.0;
public Particula1(double roza, double h){
super(h);
this.roza=roza;
}
public double f(double x, double v, double t){
return (-roza*v/masaFinal-9.8);
}
} |
Fuerza de rozamiento proporcional al cuadrado de la velocidad
- Antes de agotarse el combustible
Condiciones iniciales: t=0, dx/dt=0, x=0
public class Particula3 extends RungeKutta{
double roza;
final double masaInicial=1000.0;
double tiempo;
double vEscape;
public Particula3(double vEscape, double tiempo, double roza, double h){
super(h);
this.roza=roza;
this.tiempo=tiempo;
this.vEscape=vEscape;
}
public double f(double x, double v, double t){
double masa=masaInicial*Math.exp(-t/tiempo);
return (-roza*v*v/masa+vEscape/tiempo-9.8);
}
} |
- Después de agotarse el combustible
Condiciones iniciales: t=te, dx/dt=ve y x=xe
public class Particula4 extends RungeKutta{
double roza;
final double masaFinal=300.0;
public Particula4(double roza, double h){
super(h);
this.roza=roza;
}
public double f(double x, double v, double t){
return (-roza*v*v/masaFinal-9.8);
}
}
|
Objetos de las clases Particula, Particula1, Particula3, Particula4
public class MiCanvas extends Canvas {
//parámetros
final double masaInicial=1000.0;
final double masaFinal=300;
boolean bLineal=true;
int opcion=1;
double tMax=0.0;
final double dt=0.025;
RungeKutta particula;
Estado e=new Estado(0.0, 0.0, 0.0);
void setNuevo(double vEscape, double tiempo, double roza, boolean bLineal){
//tiempo hasta que se agota el combustible
tMax=-tiempo*Math.log(masaFinal/masaInicial);
e=new Estado(0.0, 0.0, 0.0);
if(vEscape/tiempo<9.8){
opcion=0;
return;
}
opcion=1;
if(bLineal)
particula=new Particula(vEscape, tiempo, roza, dt);
else
particula=new Particula3(vEscape, tiempo, roza, dt);
}
void mover(){
switch(opcion){
case 0:
e.t+=dt;
break;
case 1:
particula.resolver(e);
if(e.t>tMax){
if(bLineal)
particula=new Particula1(roza, dt);
else
particula=new Particula4(roza, dt);
opcion=2;
}
break;
case 2:
particula.resolver(e);
if(e.v<0){
//se detiene
}
break;
default:
break;
}
repaint();
}
|
