函数集成返回“只有长度为1的数组可以转换为Python标量”

问题描述 投票:0回答:1

我正在尝试将一个函数集成到给定范围内,该函数显示零角度 (theta) 方向上的粒子流作为粒子能量 E 的函数。我尝试了多种方法并遇到了不同的错误,但最终仍然存在两种错误。我对 Python 的了解有限,我尝试学习新的方法来完成我需要的事情,但我已经研究这个函数好几天了,但没有成功。

我目前的功能如下:

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:只有长度为 1 的数组可以转换为 Python 标量

如果我不将“self”作为函数中的参数,它会返回:

类型错误:integral() 采用 0 个位置参数,但给出了 1 个

有人知道如何绕过这个吗?

python numpy scipy typeerror numerical-integration
1个回答
1
投票

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

self
仅用于类的成员函数。在类定义之外它没有意义。将其替换为一个简单的名称,比如
x
这将是要积分的函数的输入参数。

该函数必须返回

double
。由于
E
是一个数组,并且您似乎用它进行计算,因此计算出的返回值也可能是一个数组。它必须是一个标量。解决这个问题就可以了。当你用类似的东西替换你的函数时:

def integral(x):
    return x * x

然后就可以了。当然,这不是您所需要的,但这是

quad()
工作所需的参数和返回值。

您可能需要查看 here 有关如何使用

quad()
的示例。

一些建议:

  • 使用四个空格进行缩进(而不是示例中的 5 个空格)
  • 结果两边不需要括号。删除以获得更清晰的效果。
© www.soinside.com 2019 - 2024. All rights reserved.