我有一个符号数组,可以表示为:
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:
矩阵必须是二维的
编辑:我想用quadv
和has already been discussed for SciPy来做什么can apparently be done in Matlab
真正的案例has been made available here。
要运行它,您需要:
只需运行:"python curved_beam_mrs.py"
。
您将看到过程已经很慢了,主要是因为文件curved_beam.py
中的TODO
指示了集成。
如果删除文件curved_beam_mrs.py
中TODO
后面指示的注释,则速度会慢得多。
集成的函数矩阵显示在print.txt
文件中。
谢谢你!
目前没有回答
相关问题 更多 >
编程相关推荐