Après avoir lu ceci et cela, il me semble que "quad" et "quadrature" devraient être interchangeables*, du moins au niveau de la syntaxe. Étrangement, il semble qu'ils ne le soient pas :
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)
... l'exemple fonctionne bien avec "quad", mais pas avec "quadrature" - j'obtiens :
Traceback (most recent call last):
File "./test.py", line 38, in
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
Je dois passer le tuple args en une liste (cf. ligne commentée dans integr2) même si la documentation dit que cela devrait être un tuple. Il semble que c'est ce dont se plaint l'interpréteur ... (n'est-ce pas ?)
Est-ce intentionnel ? Ou est-ce que je fais quelque chose de mal ? En fin de compte, j'aimerais pouvoir choisir les méthodes d'intégration par la suite sans avoir à changer trop de choses dans le reste du code.
*En fait, je ne comprends pas vraiment comment choisir entre les deux. Je comprends la différence entre la quadrature gaussienne et la quadrature adaptative, mais je ne sais pas ce que "quadrature gaussienne adaptative" est censé signifier - le nombre de nœuds est-il adapté, si oui comment !?