
Procedimiento numérico
Sistema de ecuaciones diferenciales de segundo orden
- Cuando no desliza
Para obtener el ángulo θ que hace la varilla con el suelo en función del tiempo, se integra la ecuación diferencial mediante procedimientos numéricos con las condiciones iniciales siguientes: en el instante t=0, la varilla está inclinada un ángulo θ=θ0 y parte del reposo, ω=dθ/dt=0
- Cuando desliza
El estado inicial corresponde al estado final de la etapa anterior
public class Estado { double t; double x; double y; double vx; double vy; public Estado(double t, double x, double y, double vx, double vy) { this.t=t; this.x=x; this.y=y; this.vx=vx; this.vy=vy; } } public abstract class RungeKutta { double h; public RungeKutta(double h){ this.h=h; } public void resolver(Estado e){ //variables auxiliares double k1, k2, k3, k4; double l1, l2, l3, l4; double q1, q2, q3, q4; double m1, m2, m3, m4; //estado inicial double x=e.x; double y=e.y; double vx=e.vx; double vy=e.vy; double t=e.t; k1=h*vx; l1=h*f(x, y, vx, vy, t); q1=h*vy; m1=h*g(x, y, vx, vy, t); k2=h*(vx+l1/2); l2=h*f(x+k1/2, y+q1/2, vx+l1/2, vy+m1/2, t+h/2); q2=h*(vy+m1/2); m2=h*g(x+k1/2, y+q1/2, vx+l1/2, vy+m1/2, t+h/2); k3=h*(vx+l2/2); l3=h*f(x+k2/2, y+q2/2, vx+l2/2, vy+m2/2, t+h/2); q3=h*(vy+m2/2); m3=h*g(x+k2/2, y+q2/2, vx+l2/2, vy+m2/2, t+h/2); k4=h*(vx+l3); l4=h*f(x+k3, y+q3, vx+l3, vy+m3, t+h); q4=h*(vy+m3); m4=h*g(x+k3, y+q3, vx+l3, vy+m3, t+h); x+=(k1+2*k2+2*k3+k4)/6; vx+=(l1+2*l2+2*l3+l4)/6; y+=(q1+2*q2+2*q3+q4)/6; vy+=(m1+2*m2+2*m3+m4)/6; t+=h; //estado final e.x=x; e.y=y; e.vx=vx; e.vy=vy; e.t=t; } abstract public double f(double x, double y, double vx, double vy, double t); abstract public double g(double x, double y, double vx, double vy, double t); abstract public double fuerza_X(double x, double vx); abstract public double fuerza_Y(double x, double vx); } public class Sistema extends RungeKutta{ double lonVarilla; public Sistema(double lonVarilla, double h){ super(h); this.lonVarilla=lonVarilla; } public double f(double x, double y, double vx, double vy, double t){ return (14.7*Math.sin(x)/lonVarilla); } public double g(double x, double y, double vx, double vy, double t){ double temp=(f(x, 0.0, vx, 0.0, 0.0)*Math.cos(x)-vx*vx*Math.sin(x)) public class Sistema_Roza extends Sistema { double mu; public Sistema_Roza(double lonVarilla, double mu, double h){ super(lonVarilla, h); this.mu=mu; } public double f(double x, double y, double vx, double vy, double t){ double temp=(6*9.8-3*lonVarilla*vx*vx*Math.cos(x))*(Math.sin(x)-mu*Math.cos(x)) /(lonVarilla*(1.0+3*Math.sin(x)*(Math.sin(x)-mu*Math.cos(x)))); return temp; } public double g(double x, double y, double vx, double vy, double t){ double temp=9.8-lonVarilla*(vx*vx*Math.cos(x)+f(x, y, vx, vy, t)*Math.sin(x))/2; return (mu*temp); } public double fuerza_X(double x, double vx){ double temp=mu*fuerza_Y(x, vx); return temp; } } //Creación de objetos estado=new Estado(0.0, angInicial, 0.0, 0.0, 0.0); sistema=new Sistema(lonVarilla, dt); //movimiento, resuelve las ecuaciones diferenciales sistema.resolver(estado); double vPunta=estado.vy-estado.vx*lonVarilla*Math.cos(estado.x)/2; if((mu<muMax)&& (vPunta>0) && !bMueveDcha){ //velocidad de la punta del lápiz bMueveDcha=true; bMueveIzq=false; sistema=new Sistema(lonVarilla, dt); } if(Math.abs(sistema.fuerza_X(estado.x, estado.vx))> mu*sistema.fuerza_Y(estado.x, estado.vx)) &&!bMueveIzq){ if(sistema.fuerza_X(estado.x, estado.vx)<0.0) sistema=new Sistema_Roza(lonVarilla, -mu, dt); else sistema=new Sistema_Roza(lonVarilla, mu, dt); bMueveIzq=true; } |
