Как добавить ползунки параметров для графиков дифференциальных уравнений в Python? - PullRequest
0 голосов
/ 22 января 2019

Я использую Python для построения системы дифференциальных уравнений

dldt = a*l - b*l*p
dpdt = -c*p + d*l*p

в Jupyter Notebook.Как добавить интерактивные ползунки на график, чтобы можно было регулировать постоянные параметры в дифференциальных уравнениях?

Я пытался добавить интерактивные ползунки в соответствии с этим блокнотом Jupyter: 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, который позволяет изменять график при изменении их значений.

1 Ответ

0 голосов
/ 23 января 2019

Вам нужна функция, которая принимает параметры 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)
...