Я полный новичок в программировании, и мне нужно оптимизировать алгоритм, чтобы он работал намного быстрее.
У меня есть система дифференциальных уравнений для функций u, i, v с четырьмя параметрами beta, delta , п, в. Сначала я задал значения коэффициентов и численным методом получил значения всех трех функций, записанных в трех соответствующих массивах. Затем я пытаюсь решить обратную задачу: у нас есть три массива значений функции, и по этим значениям мы пытаемся найти коэффициенты. Для этого я написал функцию get_coefficients(u_values, i_values, v_values, t_end). Я реализовал самый глупый способ. Я установил 4 сегмента, внутри которых могут меняться параметры. И я тупо перебирал значения коэффициентов за четыре цикла while и с постоянным шагом.
Код:
Я полный новичок в программировании, и мне нужно оптимизировать алгоритм, чтобы он работал намного быстрее. У меня есть система дифференциальных уравнений для функций u, i, v с четырьмя параметрами beta, delta , п, в. Сначала я задал значения коэффициентов и численным методом получил значения всех трех функций, записанных в трех соответствующих массивах. Затем я пытаюсь решить обратную задачу: у нас есть три массива значений функции, и по этим значениям мы пытаемся найти коэффициенты. Для этого я написал функцию get_coefficients(u_values, i_values, v_values, t_end). Я реализовал самый глупый способ. Я установил 4 сегмента, внутри которых могут меняться параметры. И я тупо перебирал значения коэффициентов за четыре цикла while и с постоянным шагом. Код: [code]EPSILON = 1*pow(10, -8)
# Задаем параметры beta = 1.59*pow(10, -8) delta = pow(10, -6) p = 23.91 c = pow(10, -8)
# Задаем начальные условия u = 70000 i = 0 v = 7000
# Задаем временной интервал и шаг t = 0 t_end = 100 dt = 0.01
# Создаем списки для сохранения значений u,i,v и времени time = [] u_values = [] i_values = [] v_values = []
while t < t_end: # Подсчет инкрементов для u, i, v du1 = dt * (- beta * u * v) di1 = dt * (beta * u * v - delta * i) dv1 = dt * (p * i - c * v)
du2 = dt * (- beta * (u + du1/2) * (v + dv1/2)) di2 = dt * (beta * (u + du1/2) * (v + dv1/2) - delta * (i + di1/2)) dv2 = dt * (p * (i + di1/2) - c * (v + dv1/2))
du3 = dt * (- beta * (u + du2/2) * (v + dv2/2)) di3 = dt * (beta * (u + du2/2) * (v + dv2/2) - delta * (i + di2/2)) dv3 = dt * (p * (i + di2/2) - c * (v + dv2/2))
du4 = dt * (- beta * (u + du3) * (v + dv3)) di4 = dt * (beta * (u + du3) * (v + dv3) - delta * (i + di3)) dv4 = dt * (p * (i + di3) - c * (v + dv3))
# Обновляем значения u, i, v u += (du1 + 2*du2 + 2*du3 + du4) / 6 i += (di1 + 2*di2 + 2*di3 + di4) / 6 v += (dv1 + 2*dv2 + 2*dv3 + dv4) / 6
# Сохраняем текущие значения time.append(t) u_values.append(u) i_values.append(i) v_values.append(v)
# Обновляем время t += dt
def get_coefficients(u_values, i_values, v_values, t_end): n = 5