Procedimiento numérico
Raíz de una ecuación trascendente
Resolver por el procedimientos numérico del punto medio la ecuación trascendente
void setSoltar(){
t=0.0;
opcion=1;
w=Math.sqrt(k/M);
x=x0=altura;
y=-yEquilibrioIni;
}
void mover(){
t+=dt;
tt+=dt;
switch(opcion){
case 1: //el bloque cae
x=x0-9.8*t*t/2;
vx=-9.8*t;
if(x<-yEquilibrioIni){
vy=0.0;
vx=-Math.sqrt(2*(x0+yEquilibrioIni)*9.8);
y0=x0=-yEquilibrioIni;
t=0.0;
opcion=2;
}
break;
case 2: //choque elástico
v0x=((m-M)*vx+2*M*vy)/(M+m);
v0y=(2*m*vx+(M-m)*vy)/(m+M);
t=0.0;
opcion=3;
break;
case 3:
x=posBloque(t);
vx=v0x-9.8*t;
y=posPlataforma(t);
vy=v0y*Math.cos(w*t)-(y0*w+9.8/w)*Math.sin(w*t);
if(x<y){ //choque
double t0=puntoMedio((t-dt), t);
vx=v0x-9.8*t0;
vy=v0y*Math.cos(w*t0)-(y0*w+9.8/w)*Math.sin(w*t0);
y0=posPlataforma(t0);
x0=posBloque(t0);
t=0.0;
opcion=2;
}
break;
default:
break;
}
}
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);
if(iter==MAXITER){
System.out.println("No se ha encontrado la raíz");
}
return m;
}
double f(double t){
return (posBloque(t)-posPlataforma(t));
}
double posBloque(double t){
return (x0+v0x*t-9.8*t*t/2);
}
double posPlataforma(double t){
return (-9.8/(w*w)+v0y*Math.sin(w*t)/w+(y0+9.8/(w*w))*Math.cos(w*t));
}
|
