python积分问题。TypeError:只有大小为1的数组才能转换为Python标量

python积分问题。TypeError:只有大小为1的数组才能转换为Python标量,python,numpy,scipy,numeric,Python,Numpy,Scipy,Numeric,我试图找到一个积分函数数组,但我在形状和尺寸方面有一些问题。我找到了系数k,然后找到了区间x=(0,a)的能量,其中a=1,n=(-Nmax,Nmax)。我还试图将它们矢量化。但每次它都会给我新的错误。我不知道如何解决这个问题,因为我需要这个integrate函数调用另一个函数来绘制图形 def k_n(n): k = fsolve(lambda n : np.tan(n*a/2.) - np.tanh(n*a/2.),n) return(k) def E(n): re

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

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)
TypeError:只有大小为1的数组才能转换为Python标量 返回_quadpack._qagse(func,a,b,args,full输出,epsabs,epsrel,limit


无法将数组发送到函数进行积分。四元函数期望函数只有一个输出(就像数学函数一样)。但您可以迭代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数组。

@BillBell:“这意味着在Python中返回长度为1的元组”-不,它没有,这是拼写
(x,)
,而不是
(x)
“您在赋值语句中重新定义了集成的标识符”-这实际上也不重要,尽管样式不好。错误表示您提供了多个值(列表、元组或数组)作为一个参数,函数只需要一个。例如,
quad
只能解一个区间的积分,而不是一次解几个区间的积分。@Eric函数k_n应该返回区间数组中的所有系数k-Nmax到Nmax。很抱歉,我已更正了函数积分。我在数组和元组方面有问题,但我仍然不知道如何重写它。如果我做一个区间n_r,它将返回一个变量的元组,这会起作用。但是我不知道是否可以这样写:调用k_n并将函数积分到另一个。@hpaulj,我尝试使用另一个模或高斯函数,或者例如:被积函数=np.array([integrate(n))对于n in n_r])但是我得到了我不想要的元组中的元组。将数组传递给
integrate
会将其传递给
integrand1
integrand2
。结果是多个值,与
n\u r
的大小相匹配。这就是
quad
所阻碍的-它只能集成一个标量函数。我也尝试过了,它可以工作但是确实是的,我将有一个二维numpy数组。我使用integrate函数在最后一个函数中调用它来绘制一个图。例如,如果我在这里写
integrate=np.array([integrate(n)for n in n_r])
并调用它,例如函数fun(n,r)我会得到norm1,但我不能得到norm2,因为形状不同。
def-fun(x,n):norm1=np.sqrt(integration)norm2=norm1*np.sin(x)
但谢谢你,我想,我需要使用另一种方法,但在积分中使用四次方,或者用数字编写:)你需要什么形式的结果?你说的标准1和标准2是什么意思?什么形状不一样?我觉得这更像是一个转换的问题,而不是四元函数的问题。对于一个值,在四元函数中得到一个结果。对于具有范围的两个变量,您将收到一个矩阵。听起来和我期望的交互函数完全一样。
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]))