Python. Problems with integrals. TypeError: only size-1 arrays can be converted to Python scalars

Python. Problems with integrals. TypeError: only size-1 arrays can be converted to Python scalars

我试图找到一个积分函数数组,但我在形状和尺寸方面遇到了一些问题。我找到了系数 k,然后我找到了区间 x = (0,a) 的能量,其中 a = 1 且 n = (-Nmax, Nmax)。我也试图将它们矢量化。但每次它都会给我新的错误。我不确定如何解决这个问题,因为我需要这个集成函数来调用另一个函数来绘制图形。

def k_n(n):
    k = fsolve(lambda n : np.tan(n*a/2.) - np.tanh(n*a/2.),n)
    return(k)

def E(n):
    return(np.piecewise(n,[n<0.,n>=0.],
                        [lambda n: -k_n(n)**2 ,
                         lambda n: k_n(n)**2 ]))

def integrand1(x,n):
    return(np.sin(k_n(n)*x)**2)

def integrand2(x,n):
    return((np.sin(k_n(n)*a/2.))**2*(np.sinh(k_n(n)*(a-x)))**2/2*
np.exp(-a*k_n(n))*(np.sinh(k_n(n)*a/2.))**2)

def integrate(n): 
    integrand = spi.integrate.quad(integrand1,0,a/2,args=(n))+spi.integrate.quad(integrand2,a/2,a,args=(n)) 
    one = np.true_divide(1, integrand )
    return(one)

可能问题出在 n_rx_r

n_r = np.arange(-Nmax, Nmax,1)
x_r = np.arange(0,a,.1)

print(k_n(n_r))
print(E(n_r))
print(integrate(n_r))`

TypeError: only size-1 arrays can be converted to Python scalars.in _quad return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit

您不能将数组发送到您的函数进行集成。 quad 函数期望函数只有一个输出(就像您期望的数学函数一样)。但是您可以遍历 n_r 数组:

n_r = np.arange(-Nmax, Nmax,1)
x_r = np.arange(0,a,.1)

print(k_n(n_r))
print(E(n_r))
print(np.array([integrate(n) for n in n_r]))

结果是一个二维的numpy数组。

您可以使用

np.vectorize() 

创建积分函数的矢量化版本。

from scipy.integrate import quad

def integrand(t, n, x):
    return np.exp(-x*t) / t**n

def expint(n, x):
    return quad(integrand, 1, np.inf, args=(n, x))[0]

vec_expint = np.vectorize(expint)

一个例子是

>>>vec_expint(3, np.arange(1.0, 4.0, 0.5))
array([ 0.1097,  0.0567,  0.0301,  0.0163,  0.0089,  0.0049])

如果您想知道,这里给出了这个例子 here