Procedimientos numéricos
Ecuación diferencial de segundo orden
- Movimiento hacia arriba
Resolver la ecuación diferencial de segundo orden
por procedimientos numéricos con las condiciones iniciales t=0, x=0, dx/dt=0.
public class SistemaArriba extends RungeKutta{ double a; public SistemaArriba(double a, double h){ super(h); this.a=a; } public double f(double x, double v, double t){ double aceleracion=(9.8*(a-x)-v*v)/(a+x); return aceleracion; } } |
Se establece el estado incial
Estado estado=new Estado(0.0, 0, 0.0);
Se crea un objeto de la clase derivada
SistemaArriba sa=new SistemaArriba(0.01);
Se llama a la función resolver que determina el estado del sistema en el instante t+h conocido el estado en el instante t
sa.resolver(estado);
Cuando la velocidad se hace cero, v=0, la posición final es x1 iniciándose el movimiento hacia abajo
- Movimiento hacia abajo
Resolver la ecuación diferencial de segundo orden
por procedimientos numéricos con las condiciones iniciales t=t0,x=x1, dx/dt=0.
public class SistemaAbajo extends RungeKutta{ double a; public SistemaAbajo(double a, double h){ super(h); this.a=a; } public double f(double x, double v, double t){ double aceleracion=9.8*(a-x)/(a+x); return aceleracion; } } |
Se establece el estado incial
estado=new Estado(estado.t, x1, 0.0);
Se crea un objeto de la clase derivada
SistemaAbajo sb=new SistemaAbajo(0.01);
Se llama a la función resolver que determina el estado del sistema en el instante t+h conocido el estado en el instante t
sb.resolver(estado);
Cuando la velocidad se hace cero, v=0, la posición final es x2 que es a su vez, la posición inicial x0 para el movimiento hacia arriba, completándose un ciclo.
estado=new Estado(estado.t, x0, 0.0);
Procedimiento del punto medio
La posición final del movimiento hacia arriba es la raíz de la ecuación cúbica
con z=x/a y z0=xd/a.
La ecuación cúbica se pude resolver por el procedimiento del punto medio, pero es más exacto calcular directemente sus raíces mediante las fórmulas de la página "Raíces de una ecuación cúbica"
public class FuncionArriba extends Ecuacion { double x0; public FuncionArriba(double x0){ this.x0=x0; } public double f(double x){ double y=(x-x*x*x/3)-(x0-x0*x0*x0/3); return y; } } |
Se calcula la posición final x1 del movimiento hacia abajo conocida la posición inicial x0 de partida.
public class Aplicacion { public static void main(String[] args) { double z0=0.0; Funcion f=new FuncionArriba(z0); try{ double z1=f.puntoMedio(0.0, 2.0); System.out.println("posición final "+z1); }catch(RaizExcepcion ex){ System.out.println(ex.getMessage()); } } } |
La posición final del movimiento hacia abajo es la raíz de la ecuación trascendente
con z=x/a y z0=xd/a.
public class FuncionAbajo extends Ecuacion { double x1; public FuncionAbajo(double x1){ this.x1=x1; } public double f(double x){ double y=2*Math.log((1+x)/(1+x1))-x+x1; return y; } } |
Se calcula la posición final x2=a·z2 del movimiento hacia abajo conocida la posición inicial x1 =a·z1de partida.
public class Aplicacion { public static void main(String[] args) { double z1=Math.sqrt(3); Funcion f=new FuncionAbajo(z1); try{ double z2=f.puntoMedio(z1, 2.0); System.out.println("posición final "+z2); }catch(RaizExcepcion ex){ System.out.println(ex.getMessage()); } } } |
La posición final es x2 =a·z2 que es a su vez, la posición inicial x0 para el movimiento hacia arriba, completándose un ciclo.