从我的 SymPy 输出中,我得到了如下所示的矩阵,我必须将其集成为 2D。目前我正在按元素进行操作,如下所示。这种方法有效,但对于我的实际情况(其中和它的功能要大得多(见下面的编辑)来说,它变得太慢了(对于sympy.mpmath.quad
和):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
(此示例的作者来自:Shadmehri et al. 2012)。我已经为可以执行以下操作的人开始了 50 的赏金:
- 使其比提出的问题合理地快
- 即使有许多术语
m=15
和n=15
代码也能在不出现内存错误的情况下运行),我管理到m=7
32n=7
位
当前时间可以总结如下(用 m=3 和 n=3 测量)。由此可见,数值积分是瓶颈。
构建试验函数 = 0%
评估微分方程 = 2%
羔羊化 k1 = 22%
积分 k1 = 74%
羔羊化和积分 k2 = 2%
提取特征值 = 0%
相关问题:关于lambdify