Интеграция с "quad" и "quadrature" из Python / SciPy - PullRequest
7 голосов
/ 13 сентября 2011

После прочтения этого и этого мне приходит в голову, что и "квад", и "квадратура" должны быть взаимозаменяемыми *, по крайней мере, с точки зрения синтаксиса.Странно кажется, что это не так:

from scipy.integrate import quad as q
#from scipy.integrate import quadrature as q

def myfunc(x):
    return x

def integr():
    return q(myfunc, 0, 1)[0]

print integr()


def myfunc2(x, y):
    return x + y

def integr2(y):
    return q(myfunc2, 0, 1, args=(y))[0]
    #return q(myfunc2, 0, 1, args=[y])[0] 

print integr2(10)

... пример отлично работает для "quad", но не для "quadrature" - я получаю:

Traceback (most recent call last):
  File "./test.py", line 38, in <module>
    print integr2(10)
  File "./test.py", line 36, in integr2
    return q(myfunc2, 0, 1, args=(y))[0]
  File "/usr/lib/python2.6/dist-packages/scipy/integrate/quadrature.py", line 136, in quadrature
    newval = fixed_quad(vfunc, a, b, (), n)[0]
  File "/usr/lib/python2.6/dist-packages/scipy/integrate/quadrature.py", line 48, in fixed_quad
    return (b-a)/2.0*sum(w*func(y,*args),0), None
  File "/usr/lib/python2.6/dist-packages/scipy/integrate/quadrature.py", line 77, in vfunc
    return func(x, *args)
TypeError: myfunc2() argument after * must be a sequence, not int

Я должен переключить кортеж args в список (см. Закомментированную строку в inter2), хотя в документации сказано, что это должен быть кортеж.Казалось, это то, на что жалуется переводчик ... (верно?)

Это предназначено?Или я что-то не так делаю?В конце я хотел бы иметь возможность выбирать методы интеграции впоследствии, не меняя слишком много остальной части кода.

* На самом деле я не совсем понимаю, как выбирать между этими двумя.Я понимаю разницу между гауссовой квадратурой и адаптивной квадратурой, но я не знаю, что означает «адаптивная квадратура Гаусса» - это количество адаптированных узлов, если да, то как!?

1 Ответ

4 голосов
/ 13 сентября 2011

Проблема в строке return q(myfunc2, 0, 1, args=(y))[0], особенно в части args=(y). То, что вы хотите, это args=(y,) (обратите внимание на запятую после y) или args=[y].

Проблема в том, что в Python кортежи создаются с запятыми, а не с круглыми скобками. Посмотрите:

>>> a = (1,)
>>> b = (1)
>>> print a, type(a)
(1,) <type 'tuple'>
>>> print b, type(b)
1 <type 'int'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...