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_r
和 x_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
我试图找到一个积分函数数组,但我在形状和尺寸方面遇到了一些问题。我找到了系数 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_r
和 x_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