11

Я пытаюсь интегрировать многопараметрическую функцию в SciPy по 2D-области. Что было бы эквивалентом следующего кода Mathematica?2D-интегралы в 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 

Глядя на SciPy documentation я мог бы найти поддержку только одномерную квадратуру. Есть ли способ сделать многомерные интегралы в SciPy?

ответ

12

Я думаю, что это будет работать что-то вроде этого:

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

редактировать: Я только что обнаружил dblquad, который, кажется, делать именно то, что вы хотите:

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

Это работает. Тем не менее, я буду интегрировать функцию над сотнями тысяч маленьких ячеек. Разве это не слишком медленно, поскольку это связано с вызовом функции python? – dzhelil

+0

Я не знаю, будет ли integrate.quad внутренне векторизовать функцию или нет. Я знаю, что integrate.quadrature делает, но у меня возникла ошибка, когда я попробовал ее по двойному интегралу. Вы всегда можете ускорить интеграцию, увеличив допуск. Или еще лучше найти точное решение! – Paul

9

Если вы хотите чтобы сделать символическую интеграцию, посмотрите на 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

Должно быть пространство между x и y в 'xy'. – MOON

+0

Спасибо, я исправил проблему. –