如何在Python中使用odeint在特定时间点设置ODE的初始条件?

如何在Python中使用odeint在特定时间点设置ODE的初始条件?,python,scipy,ode,Python,Scipy,Ode,如何在Python中使用odeint在特定时间点设置ODE的初始条件 所以我有y(0)=5作为初始条件, 以下代码工作: 将numpy导入为np 从scipy.integrate导入odeint 将matplotlib.pyplot作为plt导入 #返回dy/dt的函数 def型号(y,t): k=0.3 dydt=-k*y 回程差 #初始条件 y0=5 #时点 t=np.linspace(0,20) #解赋 y=odeint(型号,y0,t) #绘图结果 plt.绘图(t,y) plt.xla

如何在Python中使用odeint在特定时间点设置ODE的初始条件

所以我有y(0)=5作为初始条件, 以下代码工作:

将numpy导入为np
从scipy.integrate导入odeint
将matplotlib.pyplot作为plt导入
#返回dy/dt的函数
def型号(y,t):
k=0.3
dydt=-k*y
回程差
#初始条件
y0=5
#时点
t=np.linspace(0,20)
#解赋
y=odeint(型号,y0,t)
#绘图结果
plt.绘图(t,y)
plt.xlabel(“时间”)
plt.ylabel('y(t)'
plt.show()
我想看一看正负时间线的图表

因此,我将
t=np.linspace(0,20)
更改为
t=np.linspace(-5,20)
,但初始条件为y(-5)=5


如何解决这个问题?

我认为你不能,根据

但是你可以分别求解正的和负的
t
,然后把它们粘在一起。将相关线路更换为

tp = np.linspace(0,20)
tm = np.linspace(0,-5)

# solve ODE
yp = odeint(model,y0,tp)
ym = odeint(model,y0,tm)

# stich together; note we flip the time direction with [::-1] construct
t = np.concatenate([tm[::-1],tp])
y = np.concatenate([ym[::-1],yp])
这就产生了
我认为你不能,根据

但是你可以分别求解正的和负的
t
,然后把它们粘在一起。将相关线路更换为

tp = np.linspace(0,20)
tm = np.linspace(0,-5)

# solve ODE
yp = odeint(model,y0,tp)
ym = odeint(model,y0,tm)

# stich together; note we flip the time direction with [::-1] construct
t = np.concatenate([tm[::-1],tp])
y = np.concatenate([ym[::-1],yp])
这就产生了

谢谢!。但如果我做不到那就太糟糕了,感觉很不方便。我将等待,看看是否有更好的解决方案。@Nor.Z出于好奇,您认为更好的解决方案应该是什么样子?@Reti43也许有其他函数代替odeint。因为这种功能在ode绘图中经常使用。@Nor.Z在y0之前和之后求解的功能可能很常见,但谁告诉过你这不是在幕后进行的呢?数值解的要点是从(t0,y0)开始,然后根据它计算y+dy。您可以使用一个形式为
solve(t,y0,t0)
的函数,在内部它将自变量拆分为[tstart,t0]和[t0,tend],并执行Piterberg向您展示的操作。谢谢!。但如果我做不到那就太糟糕了,感觉很不方便。我将等待,看看是否有更好的解决方案。@Nor.Z出于好奇,您认为更好的解决方案应该是什么样子?@Reti43也许有其他函数代替odeint。因为这种功能在ode绘图中经常使用。@Nor.Z在y0之前和之后求解的功能可能很常见,但谁告诉过你这不是在幕后进行的呢?数值解的要点是从(t0,y0)开始,然后根据它计算y+dy。你可以有一个形式为求解(t,y0,t0)的函数,在内部,它将自变量拆分为[tstart,t0]和[t0,tend],并按照皮特堡的说明进行操作。