Ответ 1
Дифференциальные уравнения временных рядов можно моделировать численно, принимая dt = небольшое число и используя одну из нескольких методов цифровой интеграции. метод Эйлера или Рунге-Кутта. Метод Эйлера может быть примитивным, но он работает нормально для некоторых уравнений, и он достаточно прост, чтобы вы могли попробовать. например:.
S '(t) = - l (t) * S (t)
I '(t) = l (t) * S (t) - g (t) * я (t)
R '(t) = g (t) * я (t)
int N = 100;
double[] S = new double[N+1];
double[] I = new double[N+1];
double[] R = new double[N+1];
S[0] = /* initial value */
I[0] = /* initial value */
R[0] = /* initial value */
double dt = total_time / N;
for (int i = 0; i < 100; ++i)
{
double t = i*dt;
double l = /* compute l here */
double g = /* compute g here */
/* calculate derivatives */
double dSdt = - I[i] * S[i];
double dIdt = I[i] * S[i] - g * I[i];
double dRdt = g * I[i];
/* now integrate using Euler */
S[i+1] = S[i] + dSdt * dt;
I[i+1] = I[i] + dIdt * dt;
R[i+1] = R[i] + dRdt * dt;
}
Жесткая часть - это выяснить, сколько шагов нужно использовать. Вы должны прочитать одну из статей, с которыми я связан. Более сложные решатели дифференциальных уравнений используют переменные размеры шага, которые адаптируются к точности/стабильности для каждого шага.
Я бы рекомендовал использовать численное программное обеспечение, такое как R или Mathematica или MATLAB или Octave, поскольку они включают в себя решатели ODE, и вам не нужно было самостоятельно решать все проблемы. Но если вам нужно сделать это как часть более крупного приложения Java, попробуйте сначала сначала с помощью математического программного обеспечения, а затем получите представление о том, какие размеры шага и какие решатели работают.
Удачи!