函数矩阵、SymPy 和 SciPy 上的数值积分

2023-11-22

从我的 SymPy 输出中,我得到了如下所示的矩阵,我必须将其积分为 2D。目前我正在按元素进行操作,如下所示。此方法有效,但速度太慢(对于sympy.mpmath.quad and scipy.integrate.dblquad)对于我的真实案例(其中A它的功能要大得多(见下面的编辑):

from sympy import Matrix, sin, cos
import sympy
import scipy
sympy.var( 'x, t' )
A = Matrix([[(sin(2-0.1*x)*sin(t)*x+cos(2-0.1*x)*cos(t)*x)*cos(3-0.1*x)*cos(t)],
            [(cos(2-0.1*x)*sin(t)*x+sin(2-0.1*x)*cos(t)*x)*sin(3-0.1*x)*cos(t)],
            [(cos(2-0.1*x)*sin(t)*x+cos(2-0.1*x)*sin(t)*x)*sin(3-0.1*x)*sin(t)]])

# integration intervals
x1,x2,t1,t2 = (30, 75, 0, 2*scipy.pi)

# element-wise integration
from sympy.utilities import lambdify
from sympy.mpmath import quad
from scipy.integrate import dblquad
A_int1 = scipy.zeros( A.shape, dtype=float )
A_int2 = scipy.zeros( A.shape, dtype=float )
for (i,j), expr in scipy.ndenumerate(A):
    tmp = lambdify( (x,t), expr, 'math' )
    A_int1[i,j] = quad( tmp, (x1, x2), (t1, t2) )
    # or (in scipy)
    A_int2[i,j] = dblquad( tmp, t1, t2, lambda x:x1, lambda x:x2 )[0]

我正在考虑一次性完成它,但我不确定这是否是正确的方法:

A_eval = lambdify( (x,t), A, 'math' )
A_int1 = sympy.quad( A_eval, (x1, x2), (t1, t2)                 
# or (in scipy)
A_int2 = scipy.integrate.dblquad( A_eval, t1, t2, lambda x: x1, lambda x: x2 )[0]

编辑: 真实案例已在这个链接。只需解压并运行shadmehri_2012.py(这个例子的作者来自:沙德梅里等人。 2012年)。 我已经开始悬赏 50 美元奖励那些能够做到以下几点的人:

  • 使其比提出的问题更快
  • 即使有很多术语,也能成功运行而不会出现内存错误m=15 and n=15在代码中),我设法达到m=7 and n=732 位

当前时序可总结如下(以 m=3 和 n=3 测量)。从这里可以看出数值积分是瓶颈。

构建试用功能 = 0%
计算微分方程 = 2%
羔羊化 k1 = 22%
积分 k1 = 74%
羔羊化和积分 k2 = 2%
提取特征值 = 0%


相关问题:关于 lambdify


我认为您可以通过在计算的不同阶段切换到数值计算来避免羔羊化时间。

也就是说,您的计算似乎是对角的,因为k1 and k2都是以下形式k = g^T X g其中 X 是某个 5x5 矩阵(内部有差分运算,但这并不重要),并且g是 5xM,其中 M 大。所以k[i,j] = g.T[i,:] * X * g[:,j].

所以你可以直接替换



for j in xrange(1,n+1):
    for i in xrange(1,m+1):
        g1 += [uu(i,j,x,t),          0,          0,          0,          0]
        g2 += [          0,vv(i,j,x,t),          0,          0,          0]
        g3 += [          0,          0,ww(i,j,x,t),          0,          0]
        g4 += [          0,          0,          0,bx(i,j,x,t),          0]
        g5 += [          0,          0,          0,          0,bt(i,j,x,t)]
g = Matrix( [g1, g2, g3, g4, g5] )
  

with



i1 = Symbol('i1')
j1 = Symbol('j1')
g1 = [uu(i1,j1,x,t),          0,          0,          0,          0]
g2 = [          0,vv(i1,j1,x,t),          0,          0,          0]
g3 = [          0,          0,ww(i1,j1,x,t),          0,          0]
g4 = [          0,          0,          0,bx(i1,j1,x,t),          0]
g5 = [          0,          0,          0,          0,bt(i1,j1,x,t)]
g_right = Matrix( [g1, g2, g3, g4, g5] )

i2 = Symbol('i2')
j2 = Symbol('j2')
g1 = [uu(i2,j2,x,t),          0,          0,          0,          0]
g2 = [          0,vv(i2,j2,x,t),          0,          0,          0]
g3 = [          0,          0,ww(i2,j2,x,t),          0,          0]
g4 = [          0,          0,          0,bx(i2,j2,x,t),          0]
g5 = [          0,          0,          0,          0,bt(i2,j2,x,t)]
g_left = Matrix( [g1, g2, g3, g4, g5] )
  

and



tmp = evaluateExpr( B*g )
k1 = r*tmp.transpose() * F * tmp
k2 = r*g.transpose()*evaluateExpr(Bc*g)
k2 = evaluateExpr( k2 )
  

by



tmp_right = evaluateExpr( B*g_right )
tmp_left = evaluateExpr( B*g_left )
k1 = r*tmp_left.transpose() * F * tmp_right
k2 = r*g_left.transpose()*evaluateExpr(Bc*g_right)
k2 = evaluateExpr( k2 )
  

没有测试(上午过去),但你明白了。

现在,不再有一个巨大的符号矩阵,这会让一切变慢,而是有两个用于试验函数索引的矩阵索引和自由参数i1,j1 and i2,j2它们发挥了作用,最后您应该将整数替换为它们。

由于要进行羔羊化的矩阵只有 5x5,并且只需要在所有循环之外进行一次羔羊化,因此羔羊化和简化的开销就消失了。此外,即使对于较大的 m、n,该问题也很容易装入内存。

集成并没有更快,但由于表达式非常小,您可以轻松地例如将它们转储到 Fortran 中或者做一些其他聪明的事情。

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

函数矩阵、SymPy 和 SciPy 上的数值积分 的相关文章

  • 使用 pythonw.exe 时 Python subprocess.call() 失败

    我有一些 Python 代码 当我使用 python exe 运行时可以正常工作 但如果我使用 pythonw exe 则失败 def runStuff commandLine outputFileName somefile txt out
  • 分页后重新显示当前标题

    我正在使用 Wea syPrint 创建文档 我有一些带有名称的部分 其中一些可能跨越多个页面 当节太长时 就会出现分页符 我想做的是重新显示当前部分的名称 最好使用相同的格式 以下 MWE 显示了分页符后如何不显示节标题 h1 First
  • 使用中序和前序遍历输出二叉树

    class Node def init self data left None right None self data data self left left self right right def inorderTraversal r
  • Python 中的 if len(list)

    我正在将 Python 代码转换为 C 代码 以便利用 HPC 系统上可用的并行性 最初的程序员在 Python 中使用了一个令我困惑的条件 if rnum lt gt current res alim 0 if len f alim f
  • 安装 python-dev 和链接库后,Cython 中的 Hello World 程序因 gcc 失败

    我创建了一个简单的 hello world 程序 并尝试使用 gcc 执行生成的 C 程序 但无论我做什么 我都会得到大量未定义的引用 SO 有很多类似的问题 但他们都说安装 python dev 或其某些变体 或添加用于链接和加载库的标志
  • 在 SQLAlchemy 中选择 NULL 值

    这是我的 PostgreSQL 表 test gt create table people name varchar primary key marriage status varchar test gt insert into peopl
  • 如何通过ODBC检索Oracle数据库函数的结果?

    我在通过 ODBC 调用 Oracle 存储函数 而不是过程 时遇到问题 我的函数非常简单 它只是连接两个字符串 我可以通过以下方式调用它 rs c execute SELECT add str yogi bubu FROM dual fo
  • 不区分大小写的用户输入字符串

    使用哪个函数使用户输入字符串不区分大小写 correctAnswer London userGuess input What is the capital of Great Britain if userGuess London print
  • 通过 rpy2 将 numpy 数组传递给 R 时出现不一致数组

    我正在尝试将 numpy 数组传递到 R 中的 GAMLSS 包 import numpy as np import rpy2 robjects as robjects from rpy2 robjects import numpy2ri
  • 将多种类型存储为 C++ 字典中的值?

    我想编写一个行为几乎等同于 Python 字典的 C 对象 C 的std map and std unordered map容纳了 Python 字典已有的一些功能 但缺乏最重要的功能之一 即能够添加任意对象和类型 即使不可能 您离实现 P
  • 如何测试 Flask 开发服务器是否已启动?

    我的 Flask 应用程序上有一个测试装置 它启动开发服务器来测试一些用户交互 对于第一个测试 我想确保服务器已启动 一般而言 无需测试特定响应代码 执行此操作的最佳方法是什么 我希望我能用self assertTrue response
  • 使用 Python 自动化旧的 DOS 应用程序

    有没有办法从Python 在Windows上 自动化旧的DOS应用程序 16位 可能需要模拟器 例如DOSBox 我想将密钥和字符串发送到应用程序 检测 DOS 屏幕 的更新并获取应用程序输出 如果 DOS 应用程序能够 隐藏 运行 即不显
  • 将 python 字典翻译为 C++

    我有包含以下代码的 python 代码 d d 0 0 0 d 1 2 1 d 2 1 2 d 2 3 3 d 3 2 4 for i j in d print d i j d j i 不幸的是 对于我的目的来说 循环遍历 python 中
  • 返回实例的类方法的类型注释

    我应该如何注释 classmethod返回一个实例cls 这是一个不好的例子 class Foo object def init self bar str self bar bar classmethod def with stuff ap
  • 修改Keras中的层权重

    我正在尝试修改 Keras 中某个层的输出 我有一个编码器 它将时间序列转换为潜在空间 之后 对于每个压缩的时间序列 我想向时间序列添加一些数字 例如我有 input d Input 100 h1 d Reshape 100 1 input
  • 使用 BeautifulSoup 查找 html 中的所有表

    我想使用 BeautifulSoup 查找 html 中的所有表格 内部表应包含在外部表中 我创建了一些有效的代码 并且它给出了预期的输出 但是 我不喜欢这个解决方案 因为它使用 decompose 这会破坏 汤 对象 你知道如何以更优雅的
  • 尝试使用 Paramiko 通过 SSH 连接到新的 EC2 实例时出现问题

    我正在编写一个脚本 该脚本使用 boto 启动一个新的 EC2 实例 并使用 Paramiko SSH 客户端在该实例上执行远程命令 无论出于何种原因 Paramiko 客户端无法连接 我收到错误 Traceback most recent
  • 覆盖 Autobahn/Twisted WebsocketClientProtocol 类

    我想重写我的 WebSocketClientFactory 类以允许传入数据填充作业队列 这是我正在尝试的连接代码 factory WebSocketClientFactory ws localhost 7096 job queue Que
  • 带约束的简单线性回归

    我开发了一种算法来循环 15 个变量并为每个变量生成一个简单的 OLS 然后算法再循环 11 次以产生相同的 15 个 OLS 回归 但 X 变量的滞后每次增加 1 我选择具有最高 r 2 的自变量 并使用 3 4 或 5 个变量的最佳滞后
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r

随机推荐

  • Spring:hibernate + ehcache

    我正在使用 hibernate 处理一个 spring 项目 并希望使用 ehcache 实现二级缓存 我看到了很多解决这个问题的方法 spring modules cache其中介绍了 Cacheable注解 ehcache spring
  • 如何以编程方式找出哪些频道属于给定 YouTube 网络?

    似乎没有官方的 YouTube API 来查找 YouTube 网络列表或哪些频道属于给定网络 有什么想法如何找到该信息吗 如果没有直接的方法 socialblade com 使用什么算法获得近似列表 我不知道这是否是像socialblad
  • 对 CUDA 内核中不同部分进行计时

    我有一个 CUDA 内核 可以调用一系列设备函数 获取每个设备功能的执行时间的最佳方法是什么 获取设备函数之一中一段代码的执行时间的最佳方法是什么 在我自己的代码中 我使用clock 函数以获得精确的计时 为了方便起见 我有宏 enum t
  • 从推送通知启动时,launchOptions 始终为零

    我正在从 Django 应用程序发送推送通知 使用django 推送通知 到 iOS 应用程序 该应用程序面向 iOS 13 我在运行 iOS 13 3 1 的 iPhone 7 上运行它 我正在 Xcode 11 3 1 中调试 我正在尝
  • Numpy 的特征值/向量不正确

    我试图找到以下矩阵的特征值 向量 A np array 1 0 0 0 1 0 1 1 0 使用代码 from numpy import linalg as LA e vals e vecs LA eig A 我得到这个作为答案 print
  • 正确使用SQL Server中的事务

    我有 2 个命令 需要两个命令都正确执行 否则都不执行 所以我认为我需要一个交易 但我不知道如何正确使用它 下面的脚本有什么问题 BEGIN TRANSACTION Tran1 INSERT INTO Test dbo T1 Title A
  • 如何在 GitHub 上搜索提交消息?

    Not 在 Git 存储库中 而是在GitHub具体来说 如何仅搜索特定存储库 分支的提交消息 您过去可以执行此操作 但 GitHub 在 2013 年中期的某个时候删除了此功能 要在本地实现此目的 您可以执行以下操作 git log g
  • 实现多个通用接口 - 类型错误

    我正在尝试做这样的事情 public interface IRepository
  • Jquery过滤列表不区分大小写

    我想过滤列表而不区分大小写 我只想匹配不匹配大写或小写的字符 XXXXXXX yyyyyyy XXxxx 如果我在搜索框中输入 X 它会同时显示 1 和 3 我添加了下面的代码 但它也区分大小写
  • bash 计算文件中单词的出现次数

    我很抱歉问了这个非常菜鸟的问题 但我还是个新手bash编程 几天前开始 基本上我想要做的是将一个文件与另一个文件中出现的所有单词一起保存 我知道我可以这样做 sort uniq c sort 问题是 之后我想获取第二个文件 再次计算出现次数
  • 使用 std::launder 从指向非活动对象的指针获取指向活动对象成员的指针?

    This question followes this one 让我们考虑一下这个示例代码 struct sso union struct char ptr char size r 8 large str char short str 16
  • R 中按最后一个空格分割字符串

    我有一个向量 其中有多个空格的字符串 我想将其分成两个向量 并按最后的空格分开 例如 vec lt c This is one And another And one more again 应该成为 vec1 c This is And A
  • 类型带反射的文字注入

    上下文 java使用guice 最后版本 大家好 是否可以通过这种方式用 Guice 注入一些 TypeLiteral public MyClass a Class
  • 在 WebApi 和 MVC 项目之间共享 SignalR 中心

    是否有推荐的方法在两个应用程序之间共享 SignalR 集线器 实际情况是一个面向公众的WebAPI项目和一个内部MVC WebApp 我想要做的是从 WebAPI 项目调用 SignalR 集线器上的方法 并将这些方法的结果推送到通过 M
  • 删除数据框中的所有左侧 NA 并向左移动已清理的行

    我有以下数据框dat 它在某些行的开头呈现特定于行的 NA 数量 dat lt as data frame rbind c NA NA 1 3 5 NA NA NA c NA 1 3 6 8 NA c 1 7 NA dat V1 V2 V3
  • Google 在抓取我们的网站时是否会忽略哈希片段 (#) 后面的内容?

    我们使用哈希片段后面的信息通过 JavaScript 显示不同的页面 以免强制浏览器再次加载整个页面 例如 页面的直接链接可能如下所示 book id page id www example com book 1234 5678 由于我们没
  • 常量对象的常量数组

    如何在 C 而不是 C 中定义常量对象的常量数组 我可以定义 int const Array init data here 但这是常量对象的非常量数组 我可以用 int const const Array init data here 这可
  • 使用 Razor 进行 POST 时 Model.List 为 null

    My view foreach var item in Model List Html HiddenFor model gt item UserId Html HiddenFor model gt item Name Html Hidden
  • 如何在 JavaScript 中将 Object {} 转换为键值对的 Array []

    我想像这样转换一个对象 1 5 2 7 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 成一个键值对数组 如下所示 1 5 2 7 3 0 4 0 如何在 JavaScript 中将对象转换为键值对数组
  • 函数矩阵、SymPy 和 SciPy 上的数值积分

    从我的 SymPy 输出中 我得到了如下所示的矩阵 我必须将其积分为 2D 目前我正在按元素进行操作 如下所示 此方法有效 但速度太慢 对于sympy mpmath quad and scipy integrate dblquad 对于我的