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
}
