Функция интеграции возвращает «только массивы длины 1 могут быть преобразованы в скаляры Python» - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь интегрировать функцию в заданный диапазон, который показывает поток частиц в направлении нулевого угла (тета) как функцию энергии 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» в качестве аргумента в функции, он вернет:

TypeError: integra () принимает 0 позиционных аргументов, но 1 было дано

ИмеетУ кого-то есть идея, как это обойти?

1 Ответ

0 голосов
/ 21 мая 2018

integral должен иметь одну из подписей, описанных в документации scipy .В вашем случае функция, принимающая аргумент double и возвращающая double, кажется подходящей.

self используется только для функций-членов класса.Это не имеет смысла вне определения класса.Замените его на простое имя, скажем x, которое будет входным аргументом интегрируемой функции.

Функция должна возвращать double.Поскольку E является массивом, и вы, похоже, выполняете с ним вычисления, то вычисленное возвращаемое значение, вероятно, также будет массивом.Это должен быть скаляр.Исправьте это, и это будет работать.Когда вы заменяете свою функцию чем-то вроде:

def integral(x):
    return x * x

, тогда это работает.Конечно, это не то, что вам нужно, но это тот тип аргументов и возвращаемых значений, которые необходимы для работы quad().

Возможно, вы захотите поискать здесь пример использования quad().

Некоторые рекомендации:

  • использовать четыре пробела для отступа (не 5, как в примере)
  • круглые скобки вокругрезультат не обязателен.Удалить для большей ясности.
...