Anterior

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

y = θ 0 θ v 2 g tan θ · d θ = 0

para calcular el límite superior de la integral, el ángulo θ, con

v 2 = 1 cos 2 θ { 1 v 0 x 2 b g ( f ( θ ) f ( θ 0 ) ) } 1 f ( θ ) = tan θ cos θ + ln | tan θ + 1 cos θ |

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

x = θ 0 θ v 2 g d θ t = θ 0 θ v g cos θ d θ

public class Funcion extends Ecuacion{
     Simpson obj;
public Funcion(Simpson obj){
this.obj=obj;
}
public double f(double x){ double y=obj.integral(obj.angIni, x, 100);
return y; } }

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)*
(1.0/(v0*Math.cos(angIni)*v0*Math.cos(angIni))-b*(h(x)-h(angIni))/9.8); return (1.0/z); } protected double h(double x){ double z=Math.tan(x)/Math.cos(x)+
Math.log(Math.abs(Math.tan(x)+1.0/Math.cos(x))); return z; } } public class Pos_X extends Simpson { public Pos_X(double b, double v0, double angulo) { super(b, v0, angulo); } public double g(double x){ double z=-v2(x)/9.8; return z; } } public class Pos_Y extends Simpson { public Pos_Y(double b, double v0, double angulo) { super(b, v0, angulo); } public double g(double x){ double z=-v2(x)*Math.tan(x)/9.8; return z; } } public class Tiempo extends Simpson { public Tiempo(double b, double v0, double angulo) { super(b, v0, angulo); } public double g(double x){ double z=-Math.sqrt(v2(x))/(Math.cos(x)*9.8); return z; } }

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 "+
hMax+" tiempo vuelo "+tVuelo); }catch(RaizExcepcion ex){ System.out.println(ex.getMessage()); } } }

 

Anterior