如何集成复杂的函数(不在真实定义与复杂定义中)

时间:2018-09-06 19:26:33

标签: python scipy acoustics

我有一个关于球体周围压力分布的怪异表达式, equation 其中,Re [A]是预定义系数的实分量,P是勒让德多项式,j和n是球形贝塞尔和诺伊曼函数。 我希望在theta上进行积分,因此我为上述方程式定义了一个函数,如下所示:

def P_rms_calc(k,a,n_max,theta): # Return the P_rms function

# Obtain Coefficients
A_m = A_m_coeff(k,a,P_a,l,z0,n_max)

P_t = []
for m in range(n_max):
    for l in range(m+1):
        P_t.append(0.5*numpy.real(A_m[l])*numpy.real(A_m[m-l])*(legendre(l)(numpy.cos(theta)))*(legendre(m-l)(numpy.cos(theta)))*((spherical_jn(l,k*r)*spherical_jn(m-l,k*r))+
                                                                                                                            (spherical_yn(l,k*r)*spherical_yn(m-l,k*r))))
    P_rms = numpy.sqrt(sum(P_t))
return P_rms

但是,当我尝试像这样使用scipy.integrate.quad进行集成时,

a0, err = quad(P_rms_calc(k,a,n_max,theta),-numpy.pi,numpy.pi)

它给出“错误:四元组:第一个参数不可调用”。如果我不给出函数的参数,

a0, err = (1/(2*numpy.pi))*quad(P_rms_calc,-numpy.pi,numpy.pi)

它给出“ TypeError:P_rms_calc()恰好接受8个参数(给定1个)”

我是否在使用集成工具Quad时缺少一些简单的东西?如果没有,那么有没有更好的方法来尝试集成此表达式?还可以随意推荐一种更有效的方法来定义均方根压力表达式。作为参考,我仅将m = 0汇总为6左右,因此使用for循环的计算时间并不可怕。感谢帮助!

1 个答案:

答案 0 :(得分:0)

使用args参数传递被积数的额外参数:

>>> def func(x, a, b):
...    return a * x**b 
... 
>>> quad(func, 0, 1, args=(1., 2.))
(0.33333333333333337, 3.700743415417189e-15)