Sistema de ecuaciones diferenciales de segundo orden
Resolver el sistema de ecuaciones diferenciales de segundo orden
Definimos una nueva energía e por unidad de masa en este sistema de unidades
Con las condiciones iniciales siguientes: en el instante t=0, x=x0, y=y0, vx=v0x, vy=v0y.
public class Sistema extends RungeKutta{
double alfa;
double d;
public Sistema(double alfa, double d, double h){
super(h);
this.alfa=alfa;
this.d=d;
}
public double f(double x, double y, double vx, double vy, double t){
double r1=Math.sqrt(x*x+y*y);
double r2=Math.sqrt((x-d)*(x-d)+y*y);
double z=-4*Math.PI*Math.PI*(x/(r1*r1*r1)+alfa*(x-d)/(r2*r2*r2));
return z;
}
public double g(double x, double y, double vx, double vy, double t){
double r1=Math.sqrt(x*x+y*y);
double r2=Math.sqrt((x-d)*(x-d)+y*y);
double z=-4*Math.PI*Math.PI*y*(1.0/(r1*r1*r1)+alfa/(r2*r2*r2));
return z;
}
public double energia(double x, double y, double vx, double vy){
double r1=Math.sqrt(x*x+y*y);
double r2=Math.sqrt((x-d)*(x-d)+y*y);
double z=(vx*vx+vy*vy)/2-4*Math.PI*Math.PI*(1.0/r1+alfa/r2);
return z;
}
}
//Objeto de la clase Sistema
void setNuevo(double alfa, double d, double x0, double y0, double V0x, double V0y){
this.d=d;
estado=new Estado(0.0, x0, y0, V0x, V0y);
sis=new Sistema(alfa, d, calculaPaso());
eInicial=oscilador.energia(x0, y0, V0x, V0y);
error=0.0;
}
double calculaPaso(){
double r1=Math.sqrt(estado.x*estado.x+estado.y*estado.y);
double r2=Math.sqrt((estado.x-d)*(estado.x-d)+estado.y*estado.y);
double distMed=Math.sqrt(r1*r2);
double dt=0.0001*Math.pow((distMed/(d*0.1)), 1.5);
return dt;
}
void mover(){
sis.resolver(estado);
sis.setPaso(calculaPaso());
double energia=oscilador.energia(estado.x, estado.y, estado.vx, estado.vy);
error=Math.abs((energia-eInicial)*100/eInicial);
if(error>1.0){
//se para;
}
}
|
