Procedimiento numérico
Resolver el sistema formado por una ecuación diferencial de segundo orden y una ecuación diferencial de primer orden por el procedimiento de Runge-Kutta
con las condiciones iniciales siguientes: en el instante t=0, x=x0, y=0, vx=0.
Con los datos: masa del protón m=1.6725·10-27 kg, carga q=1.6·10-19 C, campo magnético B en gauss (10-4 T), posición ( x, y) en mm (10-3 m) y tiempo t en ms (10-3 s) tenemos el siguiente sistema de ecuaciones diferenciales
public abstract class RungeKutta {
double h;
RungeKutta(double h){
this.h=h;
}
void setPaso(double dt){
this.h=dt;
}
public void resolver(Estado e){
//variables auxiliares
double k1, k2, k3, k4;
double l1, l2, l3, l4;
double q1, q2, q3, q4;
//estado inicial
double x=e.x;
double y=e.y;
double vx=e.vx;
double t=e.t;
k1=h*vx;
l1=h*f(x, y, vx, t);
q1=h*g(x, y, vx, t);
k2=h*(vx+l1/2);
l2=h*f(x+k1/2, y+q1/2, vx+l1/2, t+h/2);
q2=h*g(x+k1/2, y+q1/2, vx+l1/2, t+h/2);
k3=h*(vx+l2/2);
l3=h*f(x+k2/2, y+q2/2, vx+l2/2, t+h/2);
q3=h*g(x+k2/2, y+q2/2, vx+l2/2, t+h/2);
k4=h*(vx+l3);
l4=h*f(x+k3, y+q3, vx+l3, t+h);
q4=h*g(x+k3, y+q3, vx+l3, 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;
t+=h;
//estado final
e.x=x;
e.y=y;
e.vx=vx;
e.t=t;
}
abstract public double f(double x, double y, double vx, double t);
abstract public double g(double x, double y, double vx, double t);
}
public class Particula extends RungeKutta{
double campo;
double x0;
public Particula(double campo, double x0, double h){
super(h);
this.campo=campo;
this.x0=x0;
}
public double f(double x, double y, double vx, double t){
double z=-34.43946/(x*x)+91.51825114*campo*campo*(x0-x);
return z;
}
public double g(double x, double y, double vx,double t){
double z=9.56651719*campo*(x0-x);
return z;
}
}
public class Estado {
public double t;
public double x;
public double y;
public double vx;
public 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 class MiCanvas extends Canvas {
//objeto particula
Estado estado=new Estado(0.0, 2.0, 0.0, 0.0, 0.0);
Particula particula=null;
//...
void setNuevo(double campo, double x0){
estado=new Estado(0.0, x0, 0, 0, 0);
particula=new Particula(campo, x0, 0.005);
}
void mover(){
particula.resolver(estado);
if(estado.x<=0.0){
//se detiene
estado.x=0.0;
}
}
|
