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