SciPy는 적분 계산 관련된 기능을 제공하고 있다. 이번 포스팅에서는 Scipy에서 제공하는 적분 관련 기능인 quad, dblquad, tplquad 사용 방법에 대해서 알아본다.
- 목차 -
2. 이중 적분(Double Integral) 계산하기 with dblquad
3. 삼중 적분(Triple Integral) 계산하기 with tplquad
1. 일반 적분 계산하기 with quad
1) 기본
quad를 사용하면 일반적인 적분 계산이 가능하다. quad는 첫 번째 인자로 적분하고자 할 함수를 넣고, 두 번째, 세 번째 인자의 각각 적분 구간의 시작 값과 끝 값을 넣어준다. quad는 적분 값과 오차를 튜플로 리턴하게 된다.
아래 코드는
∫10x2dx
를 계산한다.
def f(x): return x**2 result = quad(f, 0, 1) ## 적분 결과(적분값, 오차) print('적분값 :', result[0]) print('오차 :', result[1])

quad는 무한대를 갖는 적분 구간도 계산 가능하다. 아래 코드는
∫∞0e−xdx
를 계산한다.
def g(x): return np.exp(-x) result = quad(g, 0, np.infty) print('적분값 :', result[0]) print('오차 :', result[1])

2) 부분 인자 사용
예를 들어 다음을 적분한다고 해보자.
I(a,b)=∫40(ax2+bx+1)dx
위 적분은 a,b에 따라 달라진다. 즉, 적분 인자 x외에 다른 부분 인자가 있는 경우인데 이러한 적분을 하기 위해선 args 인자를 사용해야 한다. 다만 부분 인자는 적분하고자 할 함수에서 두 번째 인자부터 차례대로 정의해주어야 한다. 아래 코드는 I(3,2)를 계산한다.
def integrand(x, a, b): ## a, b는 x 다음에 정의해야한다. return a*x**2+b*x+1 result = quad(integrand, 0, 4, args=(3, 2)) print('적분값 :', result[0]) print('오차 :', result[1])

3) 다중 적분
quad를 반복 사용하면 이중 적분 그리고 더 나아가 다중 적분도 가능하다. 여기서는 아래의 적분 값을 계산해보는 방법을 알아보자.
∫∞0∫∞1e−xtt3dtdx
먼저 적분 함수 integrand를 정의한다. 그리고 t에 대한 안쪽 적분 값을 계산하는 internel_integrand를 정의하고 quad로 기존 적분 값을 계산하면 되는 것이다.
def integrand(t, n, x): ## 적분 함수 return np.exp(-x*t) / t**n def internel_integrand(n, x): ## 안쪽 적분 계산 res = quad(integrand, 1, np.infty, args=(n, x)) return res[0] ## res 첫번째 원소가 적분값 result = quad(lambda x: internel_integrand(3, x), 0, np.infty) print('적분값 :', result[0]) print('오차 :', result[1])

2. 이중 적분(Double Integral) 계산하기 with dblquad
dblquad를 사용하면 이중 적분 계산도 쉽게 할 수 있다. 사실 quad로 할 수 있으나 다변수 함수에 대한 적분은 dblquad로 하는 것이 더 빠르다고 한다.
dblquad는 적분하고자 할 함수와 바깥 적분 구간 시작과 끝, 안쪽 적분 구간 시작과 끝을 인자로 받는다. 아래 코드는
∫0.50∫1−2y0xydxdy
를 계산한다.
from scipy.integrate import dblquad def f(x, y): return x*y result = dblquad(f, 0, 0.5, 0, lambda y: 1-2*y) print('적분값 :', result[0]) print('오차 :', result[1])

3. 삼중 적분(Triple Integral) 계산하기 with tplquad
tplquad를 사용하면 삼중 적분도 가능하다. 방법은 dblquad와 유사하다. 삼중 적분이므로 구간이 하나 더 추가되어야 한다.
아래 코드는
∫30∫20∫10(xy+z)dxdydz
를 계산한다.
from scipy.integrate import tplquad def f(x, y, z): return x*y+z result = tplquad(f, 0, 3, 0, 2, 0, 1) print('적분값 :', result[0]) print('오차 :', result[1])

'프로그래밍 > SciPy' 카테고리의 다른 글
[Scipy] 3. 관측된 (x, y, z) 데이터로부터 xy 평면에 격자형 좌표에 대한 z값을 보간법(Interpolation)으로 추정하기 (feat. griddata) (0) | 2023.01.15 |
---|---|
[SciPy] 1. 확률 분포와 확률 변수 (feat. scipy.stat) (0) | 2022.08.28 |
댓글