
Procedimientos numéricos
Sistema de dos ecuaciones diferenciales de segundo orden
public class Particula extends RungeKutta{ double b; public Particula(double b, double h){ super(h); this.b=b; } public double f(double x, double y, double vx, double vy){ double ax=-b*Math.sqrt(vx*vx+vy*vy)*vx; return ax; } public double g(double x, double y, double vx, double vy){ double ay=-9.8-b*Math.sqrt(vx*vx+vy*vy)*vy; return ay; } } |
Se establece el estado incial
double v0x=v0*Math.cos(angulo*Math.PI/180);
double v0y=v0*Math.sin(angulo*Math.PI/180);
Estado estado=new Estado(0.0, 0.0, 0.0, v0x, v0y);
Se crea un objeto de la clase derivada
Particula p=new Particula(b, 0.025);
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
p.resolver(estado);
Integral de Simpson y procedimiento del punto medio
El alcance x y el tiempo de vuelo t se calculan cuando y=0. Primero, se resuelve la ecuación trascendente
para calcular el límite superior de la integral, el ángulo θ, con
Una vez calculado el límite superior θ, de la integral, se calcula el alcance x y el tiempo de vuelo t, resolviendo numéricamente las integrales
public class Funcion extends Ecuacion{ Simpson obj; |
Clases para resolver numéricamente las integrales
public abstract class Simpson { protected double v0; protected double angIni; protected double b; public Simpson(double b, double v0, double angulo){ this.b=b; this.v0=v0; this.angIni=angulo; } public double integral(double a, double b, int n){ if(n%2==1) n++; double h=(b-a)/n; double suma=g(a)+g(b); for(int i=1; i<n; i+=2){ suma+=4*g(a+i*h); } for(int i=2; i<n; i+=2){ suma+=2*g(a+i*h); } return (suma*h/3); } abstract public double g(double x); protected double v2(double x){ double z=Math.cos(x)*Math.cos(x)* |
Calcula el ángulo final, la altura máxima, el alcance y el tiempo de vuelo
public class Aplicacion { public static void main(String[] args) { double angIni=45*Math.PI/180; double v0=60.0; double b=0.0025; Simpson pos_Y=new Pos_Y(b, v0, angIni); Funcion f=new Funcion(pos_Y); try{ //con -90º hay desbordamiento double angFinal=f.puntoMedio((-88*Math.PI/180), angIni); double hMax=pos_Y.integral(angIni, 0.0, 100); double alcance=new Pos_X(b, v0, angIni).integral(angIni, angFinal, 100); double tVuelo=new Tiempo(b, v0, angIni).integral(angIni, angFinal, 100); System.out.println("Alcance "+alcance+" altura máxima "+ |