前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数值积分法求解常微分方程组

数值积分法求解常微分方程组

作者头像
用户6021899
发布2023-03-03 09:08:28
4900
发布2023-03-03 09:08:28
举报

Scipy 的 integrate 模块的 odeint 函数也可以用来以数值积分法求解常微分方程组。下面的代码以 猎物-捕食者模型为例讲解其用法。

代码语言:javascript
复制
代码语言:javascript
复制
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()

图中可以看出,狼的数量快速增长的时候,羊的数量急速下降。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档