Python 如何使用solve_ivp通过精确点?

Python 如何使用solve_ivp通过精确点?,python,scipy,ode,odeint,Python,Scipy,Ode,Odeint,我有一个ODE系统,当解算器到达一个精确的时间点时,我想更改变量的值。 我想做的与此类似 我尝试的是使用else和if来检查是否达到了时间t。但是,这不起作用,因为包含时间的数组没有通过该精确点。 还试图使用t_eval,但没有成功 使用julia示例中显示的相同问题,我们有: 来自scipy.integrate import solve\u ivp的 将numpy作为np导入 将matplotlib.pyplot作为plt导入 def f(t,u): 如果t==4且u[0]

我有一个ODE系统,当解算器到达一个精确的时间点时,我想更改变量的值。 我想做的与此类似

我尝试的是使用else和if来检查是否达到了时间t。但是,这不起作用,因为包含时间的数组没有通过该精确点。 还试图使用t_eval,但没有成功

使用julia示例中显示的相同问题,我们有:

来自scipy.integrate import solve\u ivp的

将numpy作为np导入
将matplotlib.pyplot作为plt导入
def f(t,u):
如果t==4且u[0]<4:
u[0]+=10
du=np.空(1)
du[0]=-u[0]
返回du
u0=[10.0]
V=1
t=[0,10]
u0=[10.0]
sol=求解ivp(f,t,u0)
plt.plot(sol.t,sol.y[0])

有没有复制julia回调函数的方法?

与其用回调函数精确地复制代码,不如分两个阶段求解方程:

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


def f(t, u):
    du = -u
    return du


dose = 10.0

u0 = dose
V = 4

t0 = 0
t1 = 4
t2 = 10

t = np.linspace(t0, t1, 100)
sol1 = solve_ivp(f, [t0, t1], [u0], dense_output=True, t_eval=t)

u0 = sol1.y[0, -1]
if u0 / V < 4:
    u0 += dose

t = np.linspace(t1, t2, 150)
sol2 = solve_ivp(f, [t1, t2], [u0], dense_output=True, t_eval=t)

plt.plot(sol1.t, sol1.y[0], 'b')
plt.plot([sol1.t[-1], sol2.t[0]], [sol1.y[0, -1], sol2.y[0, 0]], 'b--')
plt.plot(sol2.t, sol2.y[0], 'b')
plt.grid()
plt.xlabel('t')
plt.show()
将numpy导入为np
来自scipy.integrate import solve\u ivp
将matplotlib.pyplot作为plt导入
def f(t,u):
du=-u
返回du
剂量=10.0
u0=剂量
V=4
t0=0
t1=4
t2=10
t=np.linspace(t0,t1,100)
sol1=求解ivp(f[t0,t1],[u0],密集输出=True,t\u eval=t)
u0=sol1.y[0,-1]
如果u0/V<4:
u0+=剂量
t=np.linspace(t1,t2,150)
sol2=求解ivp(f[t1,t2],[u0],密集输出=True,t\u eval=t)
plt.plot(sol1.t,sol1.y[0],'b')
plt.plot([sol1.t[-1],sol2.t[0]],[sol1.y[0,-1],sol2.y[0,0]],'b--')
plt.plot(sol2.t,sol2.y[0],'b')
plt.grid()
plt.xlabel('t')
plt.show()