使用SciPy集成返回矩阵或数组的函数

2024-10-17 06:23:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个符号数组,可以表示为:

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]])

等等。。。



我需要在x上对g进行数值积分,比如说from 0. to 100.(在实际情况下积分没有精确解),在我目前的方法中,我必须lambdify中的每个元素g并分别对其进行积分。我正在使用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:矩阵必须是二维的


编辑:我想用quadvhas already been discussed for SciPy来做什么can apparently be done in Matlab

真正的案例has been made available here

要运行它,您需要:

  • 纽比
  • 短发
  • matplotlib文件
  • 同情心

只需运行:"python curved_beam_mrs.py"

您将看到过程已经很慢了,主要是因为文件curved_beam.py中的TODO指示了集成。

如果删除文件curved_beam_mrs.pyTODO后面指示的注释,则速度会慢得多。

集成的函数矩阵显示在print.txt文件中。

谢谢你!


Tags: 文件方法frompy元素for矩阵matrix