11

J'essaie d'intégrer une fonction multivariable dans SciPy sur une zone 2D. Quel serait l'équivalent du code Mathematica suivant?Intégrales 2D dans SciPy

In[1]:= F[x_, y_] := Cos[x] + Cos[y] 

In[2]:= Integrate[F[x, y], {x, -\[Pi], \[Pi]}, {y, -\[Pi], \[Pi]}] 

Out[2]= 0 

En regardant le SciPy documentation je ne pouvais trouver un soutien pour quadrature unidimensionnelle. Existe-t-il un moyen de faire des intégrales multidimensionnelles dans SciPy?

Répondre

12

Je pense que cela fonctionnerait quelque chose comme ceci:

def func(x,y): 
    return cos(x) + cos(y) 

def func2(y, a, b): 
    return integrate.quad(func, a, b, args=(y,))[0] 

print integrate.quad(func2, -pi/2, pi/2, args=(-pi/2, pi/2))[0] 

Wolfram|Alpha agrees

edit: Je viens de découvrir dblquad qui semble faire exactement ce que vous voulez:

print integrate.dblquad(func, -pi/2, pi/2, lambda x:-pi/2, lambda x:pi/2)[0] 
+0

Cela fonctionne. Cependant, j'intégrerai la fonction sur des centaines de milliers de petites cellules. Cela ne serait-il pas trop lent car cela impliquerait d'appeler une fonction python? – dzhelil

+0

Je ne sais pas si integra.quad va vectoriser la fonction en interne ou non. Je sais intégrer.quadrature, mais j'ai eu une erreur quand je l'ai essayé sur une double intégrale. Vous pouvez toujours accélérer l'intégration en augmentant la tolérance. Ou mieux encore, trouvez une solution exacte! – Paul

9

Si vous voulez pour faire l'intégration symbolique, jetez un oeil à sympy (code.google.com/p/sympy):

import sympy as s 
x, y = s.symbols('x, y') 
expr = s.cos(x) + s.sin(y) 
expr.integrate((x, -s.pi, s.pi), (y, -s.pi, s.pi)) 
+0

Il doit y avoir un espace entre x et y dans 'xy'. – MOON

+0

Merci, j'ai résolu le problème. –

Questions connexes