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 "+ |
