Как работать с параметром, индексированным t в дифференциальной функции при использовании scipy.integrate.solve_ivp - PullRequest
0 голосов
/ 04 июня 2019

Я хотел бы использовать solve_ivp для моделирования системы, которая развивает следующую дифференциальную функцию:

dy (т) = A D (т) + B y (т)

Что касается меня, то это целое число от 0, я сделал

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

def fun(t, y, D, A, B):
    dD1 = A*D[int(t)] - B*y
    return dD1#[dD1, dD2]

D = np.zeros((1024))
D[10:34] = 12
tspan = np.linspace(0, np.size(D)-1, np.size(D))

sol = solve_ivp(lambda t, y: fun(t, y, D, A=0.8, B=0.025),
                [tspan[0], tspan[-1]], 
                [0], method='RK45', t_eval=tspan)

plt.figure()
plt.plot(sol.t, sol.y[0,])

Это дает мне ожидаемый результат с пиком y при t = 34. enter image description here Однако, если я смещу интервал, в котором D имеет ненулевые значения, просто заменив

D[10:34] = 12

с

D[420:444] = 12

Я ожидаю, что я могу получить y той же формы, но только смещенную, в то время как результат дает мне все 0 ... Кроме того, иногда я встречаю предупреждающее сообщение:

RuntimeWarning: деление на ноль, встречающееся в double_scalars max (1, SAFETY * error_norm ** (-1 / (order + 1))))

1 Ответ

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

Полагаю, я нашел причину, вызванную просто размером шага, поэтому передайте параметры

first_step=np.size(D)/100, max_step=np.size(D)/100

Функция solve_ivp решает проблему.

...