Я использую scipy.integrate.solve_ivp для решения системы ODE, потому что она имеет функции события.
Причина, по которой мне нужна эта функция, заключается в том, что во время интеграции иногда я получаю особую матрицу, и каждый раз, когда это происходит, мне нужно завершить интеграцию и перезапустить ее с новыми параметрами.
Я хотел бы знать, возможно ли перезапустить scipy.integrate.solve_ivp с новыми параметрами после того, как произошло событие терминала, и если да, то как я могу это сделать.
Любая помощь будет принята с благодарностью.
Это мой текущий сценарий, основанный на примере из https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from animate_plot import animate
def upward_cannon(t, y):
return [y[1], -0.5]
def hit_ground(t, y):
return y[0]
def apex(t,y):
return y[1]
hit_ground.terminal = True
hit_ground.direction = -1
t0 = 0
tf = 10
sol = solve_ivp(upward_cannon, t_span=[t0, tf], y0=[90, 10], t_eval=np.arange(t0,tf, 0.01), events=[hit_ground,apex],
dense_output=True)
linesData = { 1: [[-0.0, 0.0],[0.0, 0.0]]}#,
# 2: [[-0.5, 0],[0.5, 0.0]]}#, 3: [[-0.5, 0],[0.5, 0]]}
pointsofInterest = {}#3: [[0.5, 0.0]]}#, 2: [[180.0, 10]]}
model_markers = np.array([])
plot_title = 'Upward Particle'
plot_legend = ['Forward Dynamics']
q_rep = sol.y.T[:,0]
fig = plt.figure()
ax = fig.add_subplot(111)
xs = np.arange(t0, tf, 0.01)
for idx in range(0,q_rep.shape[0]): #looping statement;declare the total number of frames
y=q_rep[idx] # traveling Sine wave
ax.cla()
ax.scatter(xs[idx],y, s=50)
plt.ylim([-10, 190])
plt.xlim([-100, 100])
plt.pause(0.001)
plt.show()
Заранее спасибо.
С уважением