如何将参数滑块添加到 python 中的微分方程图?
How to add parameter sliders to differential equation plots in python?
我正在使用 Python 绘制微分方程组
dldt = a*l - b*l*p
dpdt = -c*p + d*l*p
在 Jupyter 笔记本中。如何向绘图添加交互式滑块以允许调整微分方程中的常量参数?
我尝试按照这个 Jupyter Notebook 添加交互式滑块:https://ipywidgets.readthedocs.io/en/stable/examples/Lorenz%20Differential%20Equations.html,但不熟悉 Python 中求解和绘制微分方程,我不知道如何修改它能够与参数 a、b、c 和 d 交互。我能得到的最好的是根据下面的代码绘制静态图。
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from IPython.html.widgets import *
import ipywidgets as wg
from IPython.display import display
from numpy import pi
def f(s, t):
a = 1
b = 1
c = 1
d = 0.5
l = s[0]
p = s[1]
dldt = a*l - b*l*p
dpdt = -c*p + d*l*p
return [dldt, dpdt]
t = np.arange(0,10*pi,0.01)
s0=[0.1,5]
s = odeint(f, s0, t)
plt.plot(t,s[:,0],'r-', linewidth=2.0)
plt.plot(t,s[:,1],'b-', linewidth=2.0)
plt.xlabel("day in menstrual cycle")
plt.ylabel("concentration (ng/mL)")
plt.legend(["LH","P"])
plt.show()
我想要的是一个像静态图一样开始的图,但也有参数 a、b、c 和 d 的滑块,允许您在更改它们的值时更改图。
您需要一个将 ODE 的参数和绘图的附加参数作为命名参数的函数。在最简单的情况下,只有 a、b、c、d。此函数需要生成一个绘图。
def plot_solution(a=1.,b=1.,c=1.,d=0.5):
def f(s, t):
l, p = s
dldt = a*l - b*l*p
dpdt = -c*p + d*l*p
return [dldt, dpdt]
t = np.arange(0,10*np.pi,0.01)
s0=[0.1,5]
s = odeint(f, s0, t)
plt.plot(t,s[:,0],'r-', linewidth=2.0)
plt.plot(t,s[:,1],'b-', linewidth=2.0)
plt.xlabel("day in menstrual cycle")
plt.ylabel("concentration (ng/mL)")
plt.legend(["LH","P"])
plt.show()
然后按照文档中的说明调用交互式小部件功能。滑块是为命名参数生成的,这些参数以数字对作为输入。
w = interactive(plot_solution, a=(-2.0,2.0), b=(-2.0,2.0), c=(-2.0,2.0), d=(-2.0,2.0))
display(w)
我正在使用 Python 绘制微分方程组
dldt = a*l - b*l*p
dpdt = -c*p + d*l*p
在 Jupyter 笔记本中。如何向绘图添加交互式滑块以允许调整微分方程中的常量参数?
我尝试按照这个 Jupyter Notebook 添加交互式滑块:https://ipywidgets.readthedocs.io/en/stable/examples/Lorenz%20Differential%20Equations.html,但不熟悉 Python 中求解和绘制微分方程,我不知道如何修改它能够与参数 a、b、c 和 d 交互。我能得到的最好的是根据下面的代码绘制静态图。
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from IPython.html.widgets import *
import ipywidgets as wg
from IPython.display import display
from numpy import pi
def f(s, t):
a = 1
b = 1
c = 1
d = 0.5
l = s[0]
p = s[1]
dldt = a*l - b*l*p
dpdt = -c*p + d*l*p
return [dldt, dpdt]
t = np.arange(0,10*pi,0.01)
s0=[0.1,5]
s = odeint(f, s0, t)
plt.plot(t,s[:,0],'r-', linewidth=2.0)
plt.plot(t,s[:,1],'b-', linewidth=2.0)
plt.xlabel("day in menstrual cycle")
plt.ylabel("concentration (ng/mL)")
plt.legend(["LH","P"])
plt.show()
我想要的是一个像静态图一样开始的图,但也有参数 a、b、c 和 d 的滑块,允许您在更改它们的值时更改图。
您需要一个将 ODE 的参数和绘图的附加参数作为命名参数的函数。在最简单的情况下,只有 a、b、c、d。此函数需要生成一个绘图。
def plot_solution(a=1.,b=1.,c=1.,d=0.5):
def f(s, t):
l, p = s
dldt = a*l - b*l*p
dpdt = -c*p + d*l*p
return [dldt, dpdt]
t = np.arange(0,10*np.pi,0.01)
s0=[0.1,5]
s = odeint(f, s0, t)
plt.plot(t,s[:,0],'r-', linewidth=2.0)
plt.plot(t,s[:,1],'b-', linewidth=2.0)
plt.xlabel("day in menstrual cycle")
plt.ylabel("concentration (ng/mL)")
plt.legend(["LH","P"])
plt.show()
然后按照文档中的说明调用交互式小部件功能。滑块是为命名参数生成的,这些参数以数字对作为输入。
w = interactive(plot_solution, a=(-2.0,2.0), b=(-2.0,2.0), c=(-2.0,2.0), d=(-2.0,2.0))
display(w)