Anterior

Procedimiento numérico

Raíz de una ecuación trascendente

El instante tn+1 y la posición yn+1 en el momento del siguiente choque se determina resolviendo la ecuación trascendente por el procedimiento del punto medio

yn+vn(t-tn)-g(t-tn)2/2=sin(ωt)

 

 void inicio(double yIni, double resti, double periodo){
    this.resti=resti;
    this.frecAngular=2*Math.PI/periodo;
    this.yIni=yIni;
    t=t0=0.0;
    yb=yIni;
    vbIni=0.0;
    tipo=0;
  }
  void setNuevo(){
    t0=t;
    vbIni=0.0;
    tipo=1;
  }


   void mover(){
    t+=dt;
    yPiston=amplitud*Math.sin(frecAngular*t);
    switch(tipo){
      case 1:
          yb=yIni+vbIni*(t-t0)-4.9*(t-t0)*(t-t0);
          vb=vbIni-9.8*(t-t0);
          if(yb<yPiston){ //choque
              double tChoque=puntoMedio((t-dt), t);
              yPiston=amplitud*Math.sin(frecAngular*tChoque);
              yb=yIni+vbIni*(tChoque-t0)-4.9*(tChoque-t0)*(tChoque-t0);
              yIni=yb;
             vbIni=(1+resti)*amplitud*frecAngular*Math.cos(frecAngular*tChoque)-
(vbIni-9.8*(tChoque-t0))*resti; if((tChoque-t0)<dt){ tipo=2; } t0=tChoque; } break; case 2: yb=yPiston; vb=amplitud*frecAngular*Math.cos(frecAngular*t); break; default: break; } } //procedimiento del punto medio 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); return m; } double f(double tt){ double y=-amplitud*Math.sin(frecAngular*tt)+
yIni+vbIni*(tt-t0)-4.9*(tt-t0)*(tt-t0); return y; }

 

Anterior