Anterior

Procedimientos numéricos

Ecuación diferencial de primer orden

Resolver la ecuación diferencial de primer orden

dα dt = 1 a 2 E k M 1 1+ 2 3 cos 2 α cosα

por procedimientos numéricos con las condiciones iniciales: en el intante t=0,parte del origen x=0, α=π/4

public class Sistema extends RungeKutta{
public Sistema(double h){
      super(h);
 }    
public double f(double x, double t){
      double temp=2.0/3+1.0/(Math.cos(x)*Math.cos(x));
      return (-1.0/Math.sqrt(temp));
    }
}

Se establece el estado incial

Estado estado=new Estado(0.0, Math.PI/4);

Se crea un objeto de la clase derivada

Sistema sis=new Sistema(0.01);

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);

Procedimiento del punto medio

Resolver la ecuación trascendente

  1 cosα cosh( k x a )=0

public class Posicion {
//raíces de la ecuación
    static final double CERO=1e-10;
    static final double ERROR=0.001;
    final int MAXITER=200;
  double angulo;
  double lado;
  public double x; //abscisa
  public double y; //ordenada

  public Posicion(double lado) {
    angulo=Math.PI/4;
    this.lado=lado;
  }
  public void setAngulo(double angulo){
    this.angulo=angulo;
    x=puntoMedio();
    y=Math.sqrt(2)*lado-lado/Math.cos(angulo);
  }
   private double puntoMedio(){
        double a, b;
        if(angulo>0.0){
            a=0.0;
            b=0.88137*lado;
        }else{
            a=0.88137*lado;
            b=2*0.88137*lado;
        }

        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){
        return (cosh(0.88137-x/lado)-1.0/Math.cos(angulo));
    }
  double cosh(double x){
    return((Math.exp(x)+Math.exp(-x))/2);
  }
} 
 
Posicion pos=new Posicion(lado);

 void mover(){
    rueda.resolver(estado);
    pos.setAngulo(estado.x);
//pos.x esla abscisa 
//pos.y es la ordenada
  }
Anterior