// Evolve the dynamical system using a 4th order RK integrator private Vector3 Evolve(float h) { Vector3 xout = Vector3.zero; chaosEqn.Function(ref x, ref a_n); float h_frac = h / 2f; arg[0] = x[0] + h_frac * a_n[0]; arg[1] = x[1] + h_frac * a_n[1]; arg[2] = x[2] + h_frac * a_n[2]; chaosEqn.Function(ref arg, ref b_n); arg[0] = x[0] + h_frac * b_n[0]; arg[1] = x[1] + h_frac * b_n[1]; arg[2] = x[2] + h_frac * b_n[2]; chaosEqn.Function(ref arg, ref c_n); h_frac = h; arg[0] = x[0] + h_frac * c_n[0]; arg[1] = x[1] + h_frac * c_n[1]; arg[2] = x[2] + h_frac * c_n[2]; chaosEqn.Function(ref arg, ref d_n); h_frac = h / 6f; xout.x = x[0] + h_frac * (a_n[0] + 2f * b_n[0] + 2f * c_n[0] + d_n[0]); xout.y = x[1] + h_frac * (a_n[1] + 2f * b_n[1] + 2f * c_n[1] + d_n[1]); xout.z = x[2] + h_frac * (a_n[2] + 2f * b_n[2] + 2f * c_n[2] + d_n[2]); x[0] = xout.x; x[1] = xout.y; x[2] = xout.z; return(xout); }
// Evolve the dynamical system using a 4th order RK integrator private void Evolve(float h) { // do nothing if all inactive if (inactive == null) { return; // Particle system has not init-ed yet or is done } // (did not work in Start() -> Unity bug? Init sequencing?) if (!playing) { chaosParticles.Play(); playing = true; } for (int j = 0; j < particleCount; j++) { if (!inactive[j]) { Vector3 xout = Vector3.zero; x_in[0] = x[j, 0]; x_in[1] = x[j, 1]; x_in[2] = x[j, 2]; chaosEqn.Function(ref x_in, ref a_n); //Debug.Log("j=" + j + " x=" + x[j,0] + " arg0=" + arg[0] + " a_n0=" + a_n[0]); float h_frac = h / 2f; arg[0] = x[j, 0] + h_frac * a_n[0]; arg[1] = x[j, 1] + h_frac * a_n[1]; arg[2] = x[j, 2] + h_frac * a_n[2]; chaosEqn.Function(ref arg, ref b_n); arg[0] = x[j, 0] + h_frac * b_n[0]; arg[1] = x[j, 1] + h_frac * b_n[1]; arg[2] = x[j, 2] + h_frac * b_n[2]; chaosEqn.Function(ref arg, ref c_n); h_frac = h; arg[0] = x[j, 0] + h_frac * c_n[0]; arg[1] = x[j, 1] + h_frac * c_n[1]; arg[2] = x[j, 2] + h_frac * c_n[2]; chaosEqn.Function(ref arg, ref d_n); h_frac = h / 6f; x[j, 0] = x[j, 0] + h_frac * (a_n[0] + 2f * b_n[0] + 2f * c_n[0] + d_n[0]); x[j, 1] = x[j, 1] + h_frac * (a_n[1] + 2f * b_n[1] + 2f * c_n[1] + d_n[1]); x[j, 2] = x[j, 2] + h_frac * (a_n[2] + 2f * b_n[2] + 2f * c_n[2] + d_n[2]); if (double.IsNaN(x[j, 0]) || double.IsNaN(x[j, 1]) || double.IsNaN(x[j, 2])) { inactive[j] = true; } } } }