如何从文本文件中读取微分方程组并使用 scipy.odeint 求解该方程组?

2023-12-09

我有一个大型(>2000 个方程)ODE 系统,我想用 python scipy 的 odeint 来求解。

我有三个问题想要解决(也许我需要问 3 个不同的问题?)。 为了简单起见,我将在这里用一个玩具模型来解释它们,但请记住我的系统很大。 假设我有以下 ODE 系统:

dS/dt = -beta*S
dI/dt = beta*S - gamma*I
dR/dt = gamma*I

β = cpI

其中 c、p 和 gamma 是我要传递给 odeint 的参数。

odeint 期待这样的文件:

def myODEs(y, t, params):
    c,p, gamma = params
    beta = c*p
    S = y[0]
    I = y[1]
    R = y[2]
    dydt = [-beta*S*I,
           beta*S*I - gamma*I,
           - gamma*I]  
    return dydt

然后可以像这样传递给 odeint :

myoutput = odeint(myODEs, [1000, 1, 0], np.linspace(0, 100, 50), args = ([c,p,gamma], ))

我在 Mathematica 中生成了一个文本文件,例如 myOdes.txt,其中文件的每一行对应于我的 ODE 系统的 RHS,所以它看起来像这样

#myODEs.txt

-beta*S*I
beta*S*I - gamma*I
- gamma*I

我的文本文件看起来与 odeint 所期望的类似,但我还没有完全实现。 我有三个主要问题:

  1. 如何传递我的文本文件以便 odeint 理解这是我系统的 RHS?
  2. 如何以智能的方式(即系统的方式)定义我的变量?由于它们的数量超过 2000 个,我无法手动定义它们。理想情况下,我会将它们定义在一个单独的文件中并读取它。
  3. 我如何也将参数(有很多)作为文本文件传递?

I read 这个问题这与我的问题 1 和 2 很接近,并尝试复制它(我直接输入参数值,这样我就不必担心上面的第 3 点):

    systemOfEquations = []
    with open("myODEs.txt", "r") as fp :
        for line in fp :
            systemOfEquations.append(line)

    def dX_dt(X, t):
        vals = dict(S=X[0], I=X[1], R=X[2], t=t)
        return [eq for eq in systemOfEquations]

    out = odeint(dX_dt, [1000,1,0], np.linspace(0, 1, 5))

但我收到错误:

    odepack.error: Result from function call is not a proper array of          floats.
    ValueError: could not convert string to float: -((12*0.01/1000)*I*S),

编辑:我将代码修改为:

    systemOfEquations = []
    with open("SIREquationsMathematica2.txt", "r") as fp :
        for line in fp :
               pattern = regex.compile(r'.+?\s+=\s+(.+?)$')
               expressionString = regex.search(pattern, line) 
               systemOfEquations.append( sympy.sympify( expressionString) )


    def dX_dt(X, t):
        vals = dict(S=X[0], I=X[1], R=X[2], t=t)
        return [eq for eq in systemOfEquations]

    out = odeint(dX_dt, [1000,1,0], np.linspace(0, 100, 50), )

这是可行的(我不太明白 for 循环的前两行在做什么)。但是,我希望更自动地定义变量的过程,并且我仍然不知道如何使用此解决方案并在文本文件中传递参数。同样,如何在 dX_dt 函数内定义参数(取决于变量)?

提前致谢!


这不是完整的答案,而是一些观察/问题,但它们太长,无法发表评论。

dX_dt被多次调用odeint与一维数组y和元组t。你提供t通过args范围。y是由生成的odeint并且随着每一步的变化而变化。dX_dt应该精简,以便运行速度快。

通常是这样的表达[eq for eq in systemOfEquations]可以简化为systemOfEquations. [eq for eq...]没有做任何有意义的事情。但可能有一些关于systemOfEquations这需要它。

我建议你打印出来systemOfEquations(对于这个小型 3 行案例),为了您和我们的利益。您正在使用sympy将文件中的字符串转换为方程。我们需要看看它会产生什么。

注意myODEs是一个函数,而不是一个文件。它可以从模块导入,模块当然是文件。

重点是vals = dict(S=X[0], I=X[1], R=X[2], t=t)是产生一个字典sympy表达式可以一起使用。更直接(而且我认为更快)dX_dt函数看起来像:

def myODEs(y, t, params):
    c,p, gamma = params
    beta = c*p
    dydt = [-beta*y[0]*y[1],
           beta*y[0]*y[1] - gamma*y[1],
           - gamma*y[1]]  
    return dydt

我怀疑dX_dt运行 sympy 生成的表达式将比像这样的“硬编码”慢很多。

我要添加sympy标签,因为正如所写,这是将文本文件转换为函数的关键odeint可以使用。

我倾向于将方程的变异性放在t参数,而不是 sympy 表达式的列表。

即替换:

    dydt = [-beta*y[0]*y[1],
           beta*y[0]*y[1] - gamma*y[1],
           - gamma*y[1]]  

与类似的东西

    arg12=np.array([-beta, beta, 0])
    arg1 = np.array([0, -gamma, -gamma])
    arg0 = np.array([0,0,0])
    dydt = arg12*y[0]*y[1] + arg1*y[1] + arg0*y[0]

一旦这是正确的,那么argxx定义可以移到外部dX_dt,并通过args. Now dX_dt只是一个简单而快速的计算。

这整个sympy这种方法可能效果很好,但恐怕在实践中会很慢。但有更多的人sympy经历也许会有其他的感悟。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从文本文件中读取微分方程组并使用 scipy.odeint 求解该方程组? 的相关文章

随机推荐

  • 在Java/Android中读取文件的一段

    我确信这可能是一个简单的问题 但不幸的是这是我第一次使用 Java 和 Android SDK 我使用 Apache HTTP 库 特别是使用 MultipartEntity 在 Android 上上传文件 我正在上传到一个服务 该服务允许
  • 我可以在 Visual Studio 数据库项目存储过程中使用 SQLCMD 命令吗?

    我有很多在多个存储过程中相同的 SQL 例如 大多数过程都声明了相同的变量 并且位于相同的 try catch 块中来处理错误 我想使用 r命令 以便我可以将此代码写入一个文件中 然后将其导入到每个 sp 我可以在构建前和构建后脚本中使用该
  • 单一职责原则 - 一个很难看到的例子?

    我刚刚读到了单一职责原则 Robert C Martin 有一次指出 有时很难看出一个类具有多个职责 谁能提供这样一个类的例子吗 考虑一个具有方法的 HTTP 类 获取 网址网址 SendRequest 字符串请求 这两种方法都与 HTTP
  • PHP 浏览器检测和重定向

    All 我的应用程序支持 IE7 MOZILLA 和其他现代浏览器 有人知道一个非常好的浏览器检测和重定向 PHP 类吗 我遇到过这个 但我不确定是否有人使用过这个 http chrisschuld com projects browser
  • isMemberOfClass 与使用 == 比较类

    之间有什么真正的区别 id value BOOL compare1 value isMemberOfClass SomeClass class BOOL compare2 value class SomeClass class 检查是否va
  • 正确从列表中删除整数

    这是我刚刚遇到的一个很好的陷阱 考虑一个整数列表 List
  • 自定义数据原型 symfony3

    我有一个嵌入的表单集合 具有自定义数据原型属性 这是我自定义数据原型的方法 我的主树枝文件 listingbedroomaddpage html twig div class bedrooms div My prototype html t
  • 当 WooCommerce 中的自定义订单状态发生变化时发送电子邮件通知

    我在 WooCommerce 中创建了一个名为 延期交货 的自定义订单状态 wc backorder Add custom status to order list add action init register custom post
  • 如何调试 angular2 打字稿文件

    似乎使用最新的 angular2 npm 包无法调试打字稿源 现存的在 stackoverflow 上回答 and 媒体上的文章已经过时了 我已经创建了一个 github 问题 请支持 有两个问题 1 TypeScript 源不再被硬编码为
  • 将 2 个 QWORD 从通用寄存器移至 XMM 寄存器作为高/低 [重复]

    这个问题在这里已经有答案了 使用 masm for ml64 我试图将 2 个无符号 qwords 从 r9 和 r10 移动到 xmm0 作为无符号 128b int 到目前为止我想出了这个 mov r9 111 low qword fo
  • 如何找到算法的时间复杂度?

    我已经经历过Google and 堆栈溢出搜索 但我没有找到关于如何计算时间复杂度的清晰直接的解释 我已经知道什么了 说一下代码就像下面这样简单 char h y This will be executed 1 time int abc 0
  • 在Python中使用selenium进行分页导航

    我正在使用 Python 和 Selenium 抓取这个网站 我的代码可以工作 但它目前只抓取第一页 我想迭代所有页面并抓取它们 但它们以一种奇怪的方式处理分页 我将如何浏览页面并逐个抓取它们 分页 HTML div class pagin
  • JoptionPane 多选和可滚动选项

    我是 JoptionPane 的新手 有什么方法可以让我具有多选和可滚动功能 请在下面找到我的代码 String bigList new String 100 for int i 0 i lt bigList length i bigLis
  • 是否可以将着色器变量声明为输入和输出?

    我同时使用顶点着色器和几何着色器 我的顶点着色器只不过将其输入转发到几何着色器 version 330 core layout location 0 in uint xy layout location 1 in uint znt out
  • 在 MATLAB 中确定区域平均值

    我需要一些有关图像中 RGB 捕获的帮助 我正在使用 impixel 从图片中手动获取 RGB 但我想创建一个由 20x20 px 框组成的网格 它会自动告诉我每个框的 RGB 值 所以在一张图片中 假设我有 20 个盒子 它会告诉我 20
  • 在 PHP 中使用 URL 突出显示当前导航选项卡

    使用 php url 突出显示当前导航选项卡 带或不带 php 扩展名 php code function curPageName return substr SERVER SCRIPT NAME strrpos SERVER SCRIPT
  • 在 cloudflare 后面获取访问者 ipv4

    我只是有一个问题 我想获取访问者的 IP 地址 一切都很好 但一位用户只给了我 IPv6 这是我可以给你的代码 而且我刚刚安装了cloudflare apache2 Mod SERVER REMOTE ADDR SERVER HTTP CF
  • Jetpack Compose 添加自定义深色/浅色?

    Wh can create dark and light color palette it s ok 但它只有12种颜色 如何为浅色和深色调色板添加更多自定义颜色 您可以使用CompositionLocalProvider为了那个原因 创建
  • matplotlib 中的标记和图形大小:不确定它是如何工作的

    我想制作一个标记大小取决于图形大小的图形 这样 使用方形标记大小 无论您选择什么分辨率或图形大小 所有标记都会相互接触 遮盖背景而不重叠 这是我所在的位置 标记尺寸指定为pt 2 with 1pt 1 72inch 分辨率 以每英寸像素为单
  • 如何从文本文件中读取微分方程组并使用 scipy.odeint 求解该方程组?

    我有一个大型 gt 2000 个方程 ODE 系统 我想用 python scipy 的 odeint 来求解 我有三个问题想要解决 也许我需要问 3 个不同的问题 为了简单起见 我将在这里用一个玩具模型来解释它们 但请记住我的系统很大 假