函数集成返回”只能将长度为1的数组转换为Python标量”

Function integration returns “only length-1 arrays can be converted to Python scalars”

我正试图将一个函数整合到一个给定的范围内,该范围显示了零angular(θ)方向上的粒子流与粒子能量E的关系。我尝试了几种方法并得到了不同的错误,但最后仍然有两种错误。我对Python的了解是有限的,我尝试学习新的做事方式,但我已经使用该功能好几天了,但没有成功。

此刻我的功能如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from numpy import radians, cos, arange
from scipy.integrate import quad

def integral(self):
    theta=0
    E = arange(1, 5000, 1)
    costh = cos(radians(theta))
    a = 18 / (E * costh + 145)
    b = (E + 2.7 / costh)**-2.7
    c = (E + 5) / (E + 5 / costh)
    return a*b*c*1**4


A = quad(integral, 500, 1000)

将" quad "应用于这样的函数将返回:

TypeError: only length-1 arrays can be converted to Python scalars

如果我不将" self "作为参数放入函数中,它将返回:

TypeError: integral() takes 0 positional arguments but 1 was given

有人对如何绕过此方法有想法吗?


integral必须具有scipy文档中描述的签名之一。在您的情况下,以double作为参数并返回double的函数似乎是合适的。

self仅用于类的成员函数。在类定义之外没有任何意义。将其替换为简单的名称,例如x,它将作为要集成的函数的输入参数。

该函数必须返回double。由于E是一个数组,您似乎使用它进行计算,因此计算出的返回值也可能也是一个数组。它必须是标量。修复该问题,它将起作用。当您将函数替换为类似的内容时:

1
2
def integral(x):
    return x * x

然后它起作用了。当然,这不是您所需要的,但这是quad()起作用所需的参数和返回值。

您可能想在这里查看有关如何使用quad()的示例。

一些建议:

  • 缩进使用四个空格(而不是示例中的5)
  • 不需要在结果周围加上括号。删除以更清楚。