11

Sto cercando di integrare una funzione di più variabili in SciPy su una superficie 2D. Quale sarebbe l'equivalente del seguente codice Mathematica?integrali 2D 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 

Guardando il SciPy documentation ho trovato solo il supporto per quadratura unidimensionale. C'è un modo per fare integrali multidimensionali in SciPy?

risposta

12

penso che avrebbe funzionato o meno così:

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: Ho appena scoperto dblquad che sembra fare esattamente quello che vuoi:

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

Questo funziona. Tuttavia, integrerò la funzione su centinaia di migliaia di piccole celle. Non sarebbe troppo lento perché comporterebbe il richiamo di una funzione python? – dzhelil

+0

Non so se integr.quad vettorizzerà internamente la funzione o meno. So che integr.quadrature fa, ma ho avuto un errore quando ho provato su un integrale doppio. Si potrebbe sempre rendere l'integrazione più veloce aumentando la tolleranza. O meglio ancora, trova una soluzione esatta! – Paul

9

Se si desidera per fare integrazione simbolica, dare un'occhiata a 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

Deve esserci uno spazio tra xey in 'xy'. – MOON

+0

Grazie, ho risolto il problema. –

Problemi correlati