
Ecuación diferencial de segundo orden
Resolver la ecuación diferencial de segundo orden
por procedimientos numéricos. Las condiciones iniciales dependen de cada etapa del movimiento:
- en la primera etapa, l=d, θ=θ0, dθ/dt=0
- en la tercera etapa, l=d-δ, θ=0, dθ/dt=ω2
- en la quinta etapa, l=d, θ=θ1, dθ/dt=0
- en la séptima etapa, l=d-δ, θ=0, dθ/dt=ω4
- y así sucesivamente...
public class Estado { double t; double x; double v; public Estado(double t, double x, double v) { this.t=t; this.x=x; this.v=v; } void setDatos(double t, double x, double v){ this.t=t; this.x=x; this.v=v; } } public class Oscilador extends RungeKutta{ double longitud; public Oscilador(double longitud, double h){ super(h); this.longitud=longitud; } void setDatos(double longitud){ this.longitud=longitud; } public double f(double x, double v, double t){ return (-9.8*Math.sin(x)/longitud); } } public class MiCanvas extends Canvas { double dt=0.01; double t=0.0; double anguloMax=10*Math.PI/180; final double radio=1.0; //longitud del péndulo en m double longitud=radio; //el péndulo cambia de longitud double delta=0.05; //objeto oscilador Estado estado=new Estado(0.0, -anguloMax, 0.0); Oscilador oscilador=null; int tipo=0; void setNuevo(double delta, double angulo){ this.delta=delta; this.anguloMax=angulo*Math.PI/180; estado=new Estado(0.0, -anguloMax, 0.0); oscilador=new Oscilador(radio, dt); Etotal=Ep=9.8*(1-Math.cos(anguloMax)); t=0; tipo=0; longitud=radio; trayec.npoints=0; repaint(); } void mover(){ t+=dt; switch(tipo){ case 0: oscilador.resolver(estado); Ep=9.8*radio*(1-Math.cos(estado.x)); if(estado.x>=0){ double w0=Math.sqrt(2*9.8*(1-Math.cos(anguloMax))/radio); double w1=w0*radio*radio/((radio-delta)*(radio-delta)); anguloMax=Math.acos(1-(radio-delta)*w1*w1/19.6); Etotal=9.8*(radio-delta)*(1-Math.cos(anguloMax))+9.8*delta; estado.setDatos(0.0, 0.0, w1); oscilador.setDatos(radio-delta); longitud=radio-delta; tipo=1; } break; case 1: oscilador.resolver(estado); Ep=9.8*(radio-delta)*(1-Math.cos(estado.x))+9.8*delta; if(estado.v<=0){ longitud=radio; estado.setDatos(0.0, anguloMax, 0.0); Etotal=9.8*radio*(1-Math.cos(anguloMax)); oscilador.setDatos(radio); tipo=2; } break; case 2: oscilador.resolver(estado); Ep=9.8*radio*(1-Math.cos(estado.x)); if(estado.x<=0){ double w0=Math.sqrt(2*9.8*(1-Math.cos(anguloMax))/radio); double w1=w0*radio*radio/((radio-delta)*(radio-delta)); anguloMax=Math.acos(1-(radio-delta)*w1*w1/19.6); Etotal=9.8*(radio-delta)*(1-Math.cos(anguloMax))+9.8*delta; estado.setDatos(0.0, 0.0, -w1); oscilador.setDatos(radio-delta); longitud=radio-delta; tipo=3; } break; case 3: oscilador.resolver(estado); Ep=9.8*(radio-delta)*(1-Math.cos(estado.x))+9.8*delta; if(estado.v>=0){ estado.setDatos(0.0, -anguloMax, 0.0); oscilador.setDatos(radio); Etotal=9.8*radio*(1-Math.cos(anguloMax)); longitud=radio; tipo=0; trayec.npoints=0; if(anguloMax>1.31){ //75º máximo delta=-delta; } } break; default: break; } } } |
