
Procedimientos numéricos
Ecuación diferencial de primer orden
Resolver la ecuación diferencial de primer orden
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
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 }
