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

时间:2018-05-20 18:22:54

标签: python function numpy typeerror integrate

我正在尝试将函数集成到给定范围内,该范围显示粒子在零角度(θ)方向上的流动,作为粒子能量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:只能将length-1数组转换为Python标量

如果我没有将“self”作为参数添加到函数中,它将返回:

  

TypeError:integral()需要0个位置参数,但是给出了1个

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

1 个答案:

答案 0 :(得分:1)

integral必须拥有scipy documentation中描述的签名之一。在你的情况下,一个以double为参数并返回double的函数似乎是合适的。

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

该函数必须返回double。由于E是一个数组,并且您似乎使用它进行计算,因此计算的返回值也可能是一个数组。它必须是标量。修复它,它会工作。用以下内容替换函数时:

def integral(x):
    return x * x

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

您可能希望查看here以获取有关如何使用quad()的示例。

一些建议:

  • 使用四个空格进行缩进(不是示例中的5个)
  • 不需要围绕结果的括号。删除更清晰。