Установите значение вручную в промежуточное время в scipy.solve_ivp

Я моделирую химические реакции. Это включает в себя простые системы ODE, которые я решаю с помощью scipy.solve_ivp, как показано ниже (здесь я конвертирую виды y [0] в y [1] с фиксированной скоростью).

import matplotlib as plt
import scipy as sp
import numpy as np

def fun(t, y): 
    return [-0.1 * y[0], +0.1 * y[0]]
#return array with the ODEs of levels of state variable 0, 1...

t_span = [0, 100]
y0 = [5, 0] # initial values
nb_of_steps = 100
t_eval = np.arange(t_span[0], 
                   t_span[1], 
                   (t_span[1]-t_span[0])/nb_of_steps)

ode_solve = sp.integrate.solve_ivp(fun, 
                                   t_span,
                                   y0,
                                   method='RK45',
                                   t_eval=t_eval,
                                   dense_output=False,
                                   events=None,
                                   vectorized=False)

plt.plot(ode_solve.t,ode_solve.y[0, :]);
plt.plot(ode_solve.t,ode_solve.y[1, :]);
plt.show()

Я хотел бы вручную установить новые значения для определенных видов в заранее определенное время. Например, я хотел бы в этом примере добавить больше исходной молекулы в момент времени t = 5, чтобы увидеть, как развивается система. Или, что еще лучше, определить значения переменной для всех значений t (мой ввод, например, периодическая стимуляция)?

Вы этого не сделаете. Это было бы эквивалентно добавлению дельта-импульса к правой стороне этого компонента, решатели ODE, напротив, полагаются на правую сторону, чтобы иметь определенную степень плавности. Просто выполните интеграцию до 5, измените состояние и перезапустите интеграцию для следующего сегмента.

Lutz Lehmann 26.10.2018 23:17

@LutzL Верно, поэтому я не могу изменить значение «жестоко», но как насчет добавления параметра предопределенной переменной (непрерывного, производного)? Как периодическое колебание?

Mowgli 26.10.2018 23:43

Как например def fun(t, y): return [-0.1 * y[0], +0.1 * y[0]+sin(t)]?

Lutz Lehmann 26.10.2018 23:47
0
3
153
0

Другие вопросы по теме