Scipy 的 integrate 模块的 odeint 函数也可以用来以数值积分法求解常微分方程组。下面的代码以 猎物-捕食者模型为例讲解其用法。
import matplotlib
import numpy as np
import sympy
from scipy import integrate
from matplotlib import pyplot as plt
def f(xy, t, a, b, c, d):
"""x(t) 是猎物的数量, y(t) 是捕食者的数量。
a是猎物的出生速度,d是猎物的死亡速度,b是捕食者消耗猎物的速度,c是捕食者种群的增长速度"""
x, y = xy
return [a*x - b*x*y, c*x*y -d*y]
if __name__ == '__main__':
xy0 = 600, 400
t = np.linspace(0, 50, 250)
a,b = 0.2, 0.002
c,d = 0.001, 0.7
xy_t = integrate.odeint(f, xy0, t, args=(a, b, c, d))
matplotlib.rcParams["font.sans-serif"] = ["SimHei"]
figure, axes = plt.subplots(1, 2, figsize=(20, 10))
axes[0].plot(t, xy_t[:, 0], "green", label="猎物")
axes[0].plot(t, xy_t[:, 1], "red", label="捕食者")
axes[0].set_xlabel("时间")
axes[0].set_ylabel("动物数量")
axes[0].legend()
axes[1].plot(xy_t[:, 0], xy_t[:, 1],"blue")
axes[1].set_xlabel("猎物数量")
axes[1].set_ylabel("捕食者数量")
axes[1].set_title("猎物捕食者模型 相空间")
t = sympy.symbols('t')
x = sympy.Function('x')
y = sympy.Function('y')
axes[0].set_title(f"${sympy.latex(sympy.Eq(x(t).diff(t), a* x(t) - b* x(t)*y(t)))}$ \n ${sympy.latex(sympy.Eq(y(t).diff(t), c* x(t)*y(t) - d* y(t)))}$" )
plt.show()
图中可以看出,狼的数量快速增长的时候,羊的数量急速下降。
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!