11

Ich versuche eine multivariable Funktion in SciPy über einen 2D-Bereich zu integrieren. Was wäre der folgende Mathematica Code?2D Integrale in 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 

Mit Blick auf die SciPy documentation ich nur Unterstützung für die eindimensionale Quadratur finden konnte. Gibt es eine Möglichkeit, mehrdimensionale Integrale in SciPy zu erstellen?

Antwort

12

ich denke, es wäre so etwas wie dies funktionieren:

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: Ich habe gerade entdeckt dblquad, die genau das zu tun scheint, was Sie wollen:

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

Das funktioniert. Allerdings werde ich die Funktion über Hunderttausende kleiner Zellen integrieren. Wäre das nicht zu langsam, da es eine Python-Funktion aufrufen würde? – dzhelil

+0

Ich weiß nicht, ob integrate.quad intern die Funktion vektorisiert oder nicht. Ich weiß, integrate.quadrature tut, aber ich habe einen Fehler, wenn ich es auf einem Doppelintegral versuchte. Sie könnten die Integration immer schneller machen, indem Sie die Toleranz erhöhen. Oder noch besser, finden Sie eine exakte Lösung! – Paul

9

Wenn Sie möchten, Um symbolische Integration zu machen, schauen Sie sich sympy (code.google.com/p/sympy) an:

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

In 'xy' muss ein Leerzeichen zwischen x und y stehen. – MOON

+0

Danke, ich habe das Problem behoben. –