Использование scipy.integrate.quad для выполнения 3D-интеграла

Мотивация для вопроса

Я пытаюсь интегрировать функцию f (x, y, z) по всему пространству.

Я попытался использовать scipy.integrate.tpl x_integral = quad ( f , - np . Inf , np . Inf ) y_integral = quad ( x_integral , - np . Inf , np . Inf ) z_integral = quad ( y_integral , - np . Inf , np . inf ) & scipy.integrate.nquad для интеграции, но оба метода возвращают интеграл как 0 (когда интеграл должен быть конечным). Это связано с тем, что по мере увеличения объема интеграции область, в которой подынтегральное выражение отлична от нуля, все меньше и меньше дискретизируется. Интеграл «пропускает» эту область пространства. Однако scipy.integrate.quad, похоже, способен справляться с интегралами из [-infinity, infinity], выполняя смену переменных ...

Вопрос

Можно ли использовать scipy.integrate.quad 3 раза для выполнения тройного интеграла. Код, который я имею в виду, будет выглядеть примерно так:

quad

где f - функция f (x, y, z), x_integral следует интегрировать из x = [- бесконечность, бесконечность], y_integral следует интегрировать из y = [- бесконечность, бесконечность], а z_integral следует интегрировать из z = [- бесконечность , бесконечность]. Я знаю, что quad хочет вернуть float, и поэтому не хочет интегрировать функцию f (x, y, z) по x, чтобы вернуть функцию y и z (как строка x_integral = ... из кода выше пытается сделать). Есть ли способ реализовать код выше?

благодаря

python,scipy,integrate,quad,

1

Ответов: 1


2 принят

Вот пример с вложенным вызовом для quadвыполнения интеграции, дающей 1/8 объема сферы:

import numpy as np
from scipy.integrate import quad

def fz(x, y):
    return quad( lambda z:1, 0, np.sqrt(x**2+y**2) )[0]

def fy(x):
    return quad( fz, 0, np.sqrt(1-x**2), args=(x, ) )[0]

def fx():
    return quad( fy, 0, 1 )[0]

fx()
>>> 0.5235987755981053

4/3*np.pi/8
>>> 0.5235987755982988
питон, SciPy, интегрировать, четырехъядерный,
Похожие вопросы
Яндекс.Метрика