// Start is called before the first frame update private void SolveMovementEc(Particle[] particulas) { /*metodo RUNGE KUTTA 4 orden * Yi+1=Yi+1/6(k1+2k2+2k3+k4) * donde: * k1=hf(xi,yi) * k2=hf(xi+1/2h,yi+1/2k2) * k3 = hf(xi+1/2h,yi+1/2k2) * k4 = hf(xi+h,yi+k3) */ for (int i = 0; i < cantEsferas; i++) { k1 = particulas[i].DFase; k2.pos = k1.pos / 2.0f; k2.vel = k1.vel / 2.0f; k2 = SumaDelta(particulas[i], mStep / 2.0f, k2); k3.pos = k2.pos / 2.0f; k3.vel = k2.vel / 2.0f; k3 = SumaDelta(particulas[i], mStep / 2.0f, k3); k4 = SumaDelta(particulas[i], mStep, k3); //RUNGE KUTTA particulas[i].Fase.pos += (1.0f / 6.0f) * (k1.pos + 2 * k2.pos + 2 * k3.pos + k4.pos) * mStep; particulas[i].Fase.vel += (1.0f / 6.0f) * (k1.vel + 2 * k2.vel + 2 * k3.vel + k4.vel) * mStep; } }
private vectores SumaDelta(Particle particula, float dt, vectores b) { vectores Rk; Rk.pos = dt * particula.DFase.pos + b.pos; Rk.vel = dt * particula.DFase.vel + b.vel; return(Rk); }