【发布时间】:2013-06-08 20:25:06
【问题描述】:
我有一个符号数组,可以表示为:
from sympy import lambdify, Matrix
g_sympy = Matrix([[ x, 2*x, 3*x, 4*x, 5*x, 6*x, 7*x, 8*x, 9*x, 10*x],
[x**2, x**3, x**4, x**5, x**6, x**7, x**8, x**9, x**10, x**11]])
g = lambdify( (x), g_sympy )
所以对于每个x,我都会得到一个不同的矩阵:
g(1.) # matrix([[ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.],
# [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
g(2.) # matrix([[ 2.00e+00, 4.00e+00, 6.00e+00, 8.00e+00, 1.00e+01, 1.20e+01, 1.40e+01, 1.60e+01, 1.80e+01, 2.00e+01],
# [ 4.00e+00, 8.00e+00, 1.60e+01, 3.20e+01, 6.40e+01, 1.28e+02, 2.56e+02, 5.12e+02, 1.02e+03, 2.05e+03]])
等等...
我需要对g 与x 进行数值积分,比如from 0. to 100.(在实际情况下,积分没有精确解),在我目前的方法中,我必须lambdifyg 中的每个元素并积分它单独。我正在使用quad 进行元素集成,例如:
ans = np.zeros( g_sympy.shape )
for (i,j), func_sympy in ndenumerate(g_sympy):
func = lambdify( (x), func_sympy)
ans[i,j] = quad( func, 0., 100. )
这里有两个问题:1)lambdify用了很多次和2)for循环;我相信第一个是瓶颈,因为g_sympy 矩阵最多有 10000 个术语(这对 for 循环来说没什么大不了的)。
如上图lambdify允许对整个矩阵求值,于是我想:“有没有办法对整个矩阵求积分?”
scipy.integrate.quadrature 有一个参数vec_func 给了我希望。我期待的是这样的:
g_int = quadrature( g, x1, x2 )
要获得完全集成的矩阵,但它给出的ValueError: 矩阵必须是二维的
编辑:我正在尝试使用can apparently be done in Matlab 和quadv 和has already been discussed for SciPy 做的事情
真实案例has been made available here。
要运行它,您需要:
- numpy
- scipy
- matplotlib
- 同情
只需运行:"python curved_beam_mrs.py"。
你会看到这个过程已经很慢了,主要是因为集成,文件curved_beam.py中的TODO表示。
如果您删除文件curved_beam_mrs.py 中TODO 之后指示的注释,它会慢得多。
集成的函数矩阵显示在print.txt文件中。
谢谢!
【问题讨论】:
-
你能用数学术语来说明积分矩阵是什么意思吗?结果应该是什么,是矩阵还是标量或其他什么?
-
我将 x 从 0. 更改为 100.,并且我想整合矩阵中的每个元素,就像做
quad( g[i,j], 0., 100. ) for (i,j),v in ndenumerate(g)一样,但这是我试图避免的元素方式。 .. -
代码在 cmets 中看起来很尴尬,所以添加了一个答案 --- 实际上更多的是一个非答案:-)。
-
您在这里寻找什么样的准确度?
-
@flebool 问题已更新!
标签: python matrix numpy scipy numerical-integration