Перезапустите интегратор python scipy.solve_ivp с новыми параметрами после наступления терминального события - PullRequest
0 голосов
/ 23 июня 2019

Я использую 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()

Заранее спасибо.

С уважением

1 Ответ

0 голосов
/ 23 июня 2019

У вас есть два варианта, оба recursive.

Вариант 1: написать функцию для вызова внутри скрипта.Это было бы верно recursion и элегантно.

Вариант 2: Если ваша функция сталкивается с этими значениями, которые вам нужно разрешить, используйте argparsing и os для вызова функции с указанными значениями.

Пример:

os.system(python3 filename.py -f argparseinputs)
...