
Procedimientos numéricos
Suistema de ecuaciones diferenciales de segundo orden
Resolver el sistema de ecuaciones diferenciales de segundo orden
Tenemos un sistema de n ecuaciones diferenciales acopladas que se resuelve por procedimientos numéricos con las siguientes condiciones iniciales
En el instante t=0,
-
Todas las partículas están en sus posiciones de equilibrio. xi=0, i=1...n
- Todas las partículas están en reposo, excepto la partícula incidente que lleva velocidad v en el instante t=0 en el que choca con la segunda partícula. v1=v, vi=0, i=2…n
La clase base que describe el procedimiento numérico
public abstract class RungeKutta { double h; int n; public RungeKutta(int n, double h) { this.h=h; this.n=n; } public void setPaso(double h){ this.h=h; } public void resolver(Estado e){ double[] k1=new double[n+1]; double[] k2=new double[n+1]; double[] k3=new double[n+1]; double[] k4=new double[n+1]; double[] l1=new double[n+1]; double[] l2=new double[n+1]; double[] l3=new double[n+1]; double[] l4=new double[n+1]; //condiciones iniciales double[] x=e.x; double[] v=e.v; double t=e.t; //variables auxiliares k1[0]=h*v[0]; l1[0]=h*f(x[0], x[0], x[1]); k2[0]=h*(v[0]+l1[0]/2); l2[0]=h*f(x[0]+k1[0]/2, x[0]+k1[0]/2, x[1]+k1[1]/2); k3[0]=h*(v[0]+l2[0]/2); l3[0]=h*f(x[0]+k2[0]/2, x[0]+k2[0]/2, x[1]+k2[1]/2); k4[0]=h*(v[0]+l3[0]); l4[0]=h*f(x[0]+k3[0], x[0]+k3[0], x[1]+k3[1]); x[0]+=(k1[0]+2*k2[0]+2*k3[0]+k4[0])/6; v[0]+=(l1[0]+2*l2[0]+2*l3[0]+l4[0])/6; for(int i=1; i<n; i++){ k1[i]=h*v[i]; l1[i]=h*f(x[i-1], x[i], x[i+1]); k2[i]=h*(v[i]+l1[i]/2); l2[i]=h*f(x[i-1]+k1[i-1]/2, x[i]+k1[i]/2, x[i+1]+k1[i+1]/2); k3[i]=h*(v[i]+l2[i]/2); l3[i]=h*f(x[i-1]+k2[i-1]/2, x[i]+k2[i]/2, x[i+1]+k2[i+1]/2); k4[i]=h*(v[i]+l3[i]); l4[i]=h*f(x[i-1]+k3[i-1], x[i]+k3[i], x[i+1]+k3[i+1]); x[i]+=(k1[i]+2*k2[i]+2*k3[i]+k4[i])/6; v[i]+=(l1[i]+2*l2[i]+2*l3[i]+l4[i])/6; } k1[n]=h*v[n]; l1[n]=h*f(x[n-1], x[n], x[n]); k2[n]=h*(v[n]+l1[n]/2); l2[n]=h*f(x[n-1]+k1[n-1]/2, x[n]+k1[n]/2, x[n]+k1[n]/2); k3[n]=h*(v[n]+l2[n]/2); l3[n]=h*f(x[n-1]+k2[n-1]/2, x[n]+k2[n]/2, x[n]+k2[n]/2); k4[n]=h*(v[n]+l3[n]); l4[n]=h*f(x[n-1]+k3[n-1], x[n]+k3[n], x[n]+k3[n]); x[n]+=(k1[n]+2*k2[n]+2*k3[n]+k4[n])/6; v[n]+=(l1[n]+2*l2[n]+2*l3[n]+l4[n])/6; t+=h; //cambia el estado de la partícula for(int i=1; i<n+1; i++){ e.x[i]=x[i]; e.v[i]=v[i]; } e.t=t; } public abstract double f(double x, double y, double z); } |
La clase derivada que describe el sistema físico particular
public class Sistema extends RungeKutta{ double exponente; double cte; public Sistema(int n, double exponente, double cte, double h){ super(n, h); this.exponente=exponente; this.cte=cte; } public double f(double x0, double x, double x1){ if((x0-x)<0) x0=x; if((x-x1)<0) x1=x; double temp=cte*Math.pow((x0-x), exponente)- |
La clase cuyos objetos guardan el estado del sistema
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; } } |
Se establece el estado incial
final double cte=1.638e10/0.512; double[] x=new double[n]; double[] v=new double[n]; for(int i=0; i<n; i++){ x[i]=0.0; v[i]=0.0; } v[0]=Math.sqrt(2*9.8*0.01); Estado estado=new Estado(0.0, x, v);
Se crea un objeto de la clase derivada
Sistema sis=new Sistema(n-1, 1.5, cte, 1.0e-6);
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
sis.resolver(estado);![]()