Интеграция Scipy nquad с аргументами - PullRequest
0 голосов
/ 28 ноября 2018

Я пытался интегрировать в Python с помощью nquad.Проблема в том, что когда я пытаюсь передать дополнительные аргументы функции, которая интегрируется в nquad, она хочет передать эти параметры в пределы вместо функции.Я искал в интернете и обнаружил, что это ошибка в scipy.__version__ < 0.18.0, и тогда она была исправлена, но у меня установлена ​​версия 1.1.0, и проблема сохраняется.Что я должен делать?Упрощенный пример ниже

>>> from scipy.integrate import nquad
>>> ranges0 = lambda x: [x, 2 * x]
>>> ranges = [ranges0, [1, 2]]
>>> func = lambda x0, x1, t0, t1: x0 + x1 + t0 + t1
>>> nquad(func, ranges, args=(1,2))

>>> TypeError: <lambda>() takes exactly 1 argument (3 given)

1 Ответ

0 голосов
/ 28 ноября 2018

Я немного покопался в документации для nquad и нашел этот отрывок:

Если элемент диапазонов является вызываемым, то он будет вызываться со всемидоступных аргументов интеграции, а также любых параметрических аргументов.например, если func = f (x0, x1, x2, t0, t1), то диапазоны [0] могут быть определены как (a, b) или как (a, b) = range0 (x1, x2, t0, t1)).

Другими словами, при определении func с 4 параметрами вы должны определить range, чтобы он точно принимал 4-pos параметров.Другими словами, поскольку ваш ranges0 находится на первом месте в списке диапазонов, ему будут переданы 4-1=3 параметры, если вы поместите его на следующее место в списке, ему будут переданы 4-2=2 параметры.То же самое верно для всех дальнейших мест в массиве.Он остается равным 2, потому что вызывается с:

всеми доступными аргументами интеграции

Здесь проблема не связана со scipy, а больше связана с логической ошибкойс вашей стороны.

Таким образом, функция в списке диапазонов может никогда принимать один и только один аргумент при наличии 2 временных переменных.

...