Anterior

Procedimientos numéricos

Ecuaciones diferencial de segundo orden

Resolver la ecuación diferencial de segundo orden por el procedimiento de Runge-Kutta

La fuerza es

F = ρ g V ( 1 x L ) ρ v g V + A 2 ( P + ρ g x + ( ρ g x P ) 2 + 4 ρ g P 0 l 0 )

F = ( ρ v ρ ) g V + A 2 ( P ρ g x + ( ρ g x P ) 2 + 4 ρ g P 0 l 0 )

public class Oscilador extends RungeKutta{
    double area; 
    double volumen;
    double lonTubo;
    double densidad;
    double longitud;
    double presion;
    final double pAtm=1.013e5;
    double masa;
    public Oscilador(double area, double volumen, double lonTubo, 
double densidad,double presion, double longitud, double h){ super(h); this.area=area; this.volumen=volumen; this.lonTubo=lonTubo; this.densidad=densidad; this.longitud=longitud; this.presion=presion; masa=volumen*densidad; } public double f(double x, double v, double t){ double xAire=lonAire(x); double fuerza; if(x>0){ fuerza=area*xAire*1000*9.8+volumen*(1-x/lonTubo)
*1000*9.8-volumen*densidad*9.8; }else{ fuerza=area*xAire*1000*9.8+volumen*(1000-densidad)*9.8; } return (fuerza/masa); } private double lonAire(double x){ double a=1000*9.8; double b=presion+1000*9.8*Math.abs(x); double c; double fuerza; if(x>0){ c=presion*x-pAtm*longitud; }else{ c=-pAtm*longitud; } return ((-b+Math.sqrt(b*b-4*a*c))/(2*a)); } } public class MiCanvas extends Canvas implements MouseListener, MouseMotionListener{ //parámetros double[][] tubos={{9.8, 1.38, 1.60, 2.35}, {16.0, 1.43, 1.64, 2.29}, {17.1, 4.44, 4.97, 2.36}, {20.1, 1.74, 2.00, 2.17}}; int nTubo=1; //.... public void setNuevo(double mmHg, double velocidad){ oscilador=new Oscilador(area, volumen, tubos[nTubo][0]/100, tubos[nTubo][3]*1000, presion, longitud, 0.01); estado=new Estado(0.0, 0.0, velocidad); } //... }

Raíces de una ecuación trascendente

Hallar las raíces de la ecuación por el procedimiento del punto medio

  void explorar(double xIni, double xFin, double dx){
        double y1, y2;
	      //iRaiz=0;
        y1=f(xIni);
        for(double x=xIni; x<xFin; x+=dx){
            y2=f(x+dx);
//uno de los extremos del intervalo es raíz
            if(Math.abs(y1)<CERO & iRaiz<MAXRAICES){
                raices[iRaiz++]=x;
                y1=y2;
                continue;
            }
//no hay raíz en este intervalo
            if(y1*y2>=0.0){
                y1=y2;
                continue;
            }
//hay una raíz en este intervalo
            if(iRaiz<MAXRAICES){
                raices[iRaiz]=puntoMedio(x, x+dx);
                iRaiz++;
            }
            y1=y2;
        }
 }
public double puntoMedio(double a, double b){
        double m, ym;
        int iter=0;
        do{
            m=(a+b)/2;
            ym=f(m);
            if(Math.abs(ym)<CERO)           break;
            if(Math.abs((a-b)/m)<ERROR)     break;

            if((f(a)*ym)<0)     b=m;
            else                a=m;
            iter++;
        }while(iter<MAXITER);
        return m;
    }
 double f(double x){
    if(x>0)
        return(-tubos[nTubo][3]*1000*volumen*estado.v*estado.v/2+potencial(x, 1)+c1);
    return(-tubos[nTubo][3]*1000*volumen*estado.v*estado.v/2+potencial(x, -1)+c2);

 }

 double potencial(double x, int signo){
    double radicando=Math.sqrt((1000*9.8*x-presion)*(1000*9.8*x-presion)
+4*pAtm*longitud*1000*9.8);
    double y;
    y=1000*9.8*(area/2+100*volumen/tubos[nTubo][0])*x*x/2;
    if(signo==-1){
        y=-1000*9.8*(area/2)*x*x/2;
    }
    y+=(volumen*9.8*(tubos[nTubo][3]*1000-1000)+presion*area/2)*x-(area/(4*1000*9.8))*
(1000*9.8*x-presion)*radicando-area*pAtm*longitud*Math.log(1000*9.8*x-presion+radicando);
    return y;
  }



    

 

Anterior