Python中ODE模型的交互式连续绘图

Python中ODE模型的交互式连续绘图,python,numpy,matplotlib,scipy,ode,Python,Numpy,Matplotlib,Scipy,Ode,我想创建一个集成ode模型的脚本,这样我就可以更改其中一个参数,并查看系统对此更改的响应。例如,如果我有一个Lotka-Volterra模型(取自此): 我想为参数a和c创建一个滑块,如在中或任何其他工具中。绘图应显示始终跨越[t\u current-delta\u t,t\u current]的特定时间窗口。所以我可以通过改变参数的滑块来不断探索参数空间 怎么做 您拥有所有的片段,基本上只需更改小部件中的更新方法,使用基于滑块的新值重新计算dX_dt的积分,然后使用该值设置y线值。代码如下所示

我想创建一个集成ode模型的脚本,这样我就可以更改其中一个参数,并查看系统对此更改的响应。例如,如果我有一个Lotka-Volterra模型(取自此):

我想为参数
a
c
创建一个滑块,如在中或任何其他工具中。绘图应显示始终跨越
[t\u current-delta\u t,t\u current]
的特定时间窗口。所以我可以通过改变参数的滑块来不断探索参数空间


怎么做

您拥有所有的片段,基本上只需更改小部件中的更新方法,使用基于滑块的新值重新计算dX_dt的积分,然后使用该值设置y线值。代码如下所示:

import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

b = 0.1
d = 0.75
a=1
c=1.5
def dX_dt(X, t=0, a=1, c=1.5):
    """ Return the growth rate of fox and rabbit populations. """
    return np.array([ a*X[0] -   b*X[0]*X[1] ,  
                     -c*X[1] + d*b*X[0]*X[1] ])


t = np.linspace(0, 15,  1000)              # time
X0 = np.array([10, 5])          # initials conditions: 10 rabbits and 5 foxes  

fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)

l1, l2 = plt.plot(t, integrate.odeint(dX_dt, X0, t, (a, c)))

axcolor = 'black'
ax_a = plt.axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
ax_c = plt.axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor)

sa = Slider(ax_a, 'a', 0.1, 10.0, valinit=1)
sc = Slider(ax_c, 'c', 0.1, 10.0, valinit=1.5)


def update(val):
    a = sa.val
    c = sc.val
    x = integrate.odeint(dX_dt, X0, t, (a, c))
    l1.set_ydata(x[:,0])
    l2.set_ydata(x[:,1])
    fig.canvas.draw_idle()

sa.on_changed(update)
sc.on_changed(update)

plt.show()

你有了所有的部分,基本上只需更改小部件中的更新方法,使用基于滑块的新值重新计算dX_dt的积分,然后使用它来设置y线值。代码如下所示:

import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

b = 0.1
d = 0.75
a=1
c=1.5
def dX_dt(X, t=0, a=1, c=1.5):
    """ Return the growth rate of fox and rabbit populations. """
    return np.array([ a*X[0] -   b*X[0]*X[1] ,  
                     -c*X[1] + d*b*X[0]*X[1] ])


t = np.linspace(0, 15,  1000)              # time
X0 = np.array([10, 5])          # initials conditions: 10 rabbits and 5 foxes  

fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)

l1, l2 = plt.plot(t, integrate.odeint(dX_dt, X0, t, (a, c)))

axcolor = 'black'
ax_a = plt.axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
ax_c = plt.axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor)

sa = Slider(ax_a, 'a', 0.1, 10.0, valinit=1)
sc = Slider(ax_c, 'c', 0.1, 10.0, valinit=1.5)


def update(val):
    a = sa.val
    c = sc.val
    x = integrate.odeint(dX_dt, X0, t, (a, c))
    l1.set_ydata(x[:,0])
    l2.set_ydata(x[:,1])
    fig.canvas.draw_idle()

sa.on_changed(update)
sc.on_changed(update)

plt.show()