Это мой первый пост о переполнении стека. Так что я наткнулся на этот пример решателя solve_ivp в документации SciPy. Решаемая проблема заключается в следующем:
Пушка стреляла вверх с конечным событием при ударе. Поля терминала и направления события применяются путем исправления функции. Здесь y [0] - это положение, а y [1] - это скорость. Снаряд начинается в позиции 0 со скоростью +10. Обратите внимание, что интеграция никогда не достигает t = 100, поскольку событие является терминальным.
Код в документации следующий:
>>> def upward_cannon(t, y): return [y[1], -0.5]
>>> def hit_ground(t, y): return y[0]
>>> hit_ground.terminal = True
>>> hit_ground.direction = -1
>>> sol = solve_ivp(upward_cannon, [0, 100], [0, 10], events=hit_ground)
>>> print(sol.t_events)
[array([40.])]
>>> print(sol.t)
[0.00000000e+00 9.99900010e-05 1.09989001e-03 1.10988901e-02
1.11088891e-01 1.11098890e+00 1.11099890e+01 4.00000000e+01]
Я использовал этот решатель для решения других дифференциальные уравнения. Кроме того, я понимаю использование полей терминал и направление . Но только для этого примера я не могу понять, как работает функция upward_cannon () , используя return [y[1],-0.5]
. Вывод, соответствующий print(sol.y)
, следующий:
[[ 0.00000000e+00 9.99897510e-04 1.09985977e-02 1.10958105e-01
1.10780373e+00 1.08013149e+01 8.02419261e+01 -1.42108547e-14]
[ 1.00000000e+01 9.99995000e+00 9.99945005e+00 9.99445055e+00
9.94445555e+00 9.44450555e+00 4.44500550e+00 -1.00000000e+01]]
Поскольку в коде не упомянуто основное дифференциальное уравнение, как решатель создает приведенные выше значения для y
? Я знаю, return [y[1],-0.5]
что-то делает, но я не могу объяснить, что он делает.