8 votes

Intégration avec "quad" et "quadrature" de Python/SciPy

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 !?

5voto

rm. Points 2237

Le problème se trouve dans la ligne return q(myfunc2, 0, 1, args=(y))[0], plus précisément dans la partie args=(y). Ce que vous voulez est args=(y,) (remarquez la virgule après y) ou args=[y].

Le problème est que dans Python, les tuples sont créés avec des virgules, pas avec des parenthèses. Regardez:

>>> a = (1,)
>>> b = (1)
>>> print a, type(a)
(1,) 
>>> print b, type(b)
1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X