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