SciPy는 적분 계산 관련된 기능을 제공하고 있다. 이번 포스팅에서는 Scipy에서 제공하는 적분 관련 기능인 quad, dblquad, tplquad 사용 방법에 대해서 알아본다.
- 목차 -
2. 이중 적분(Double Integral) 계산하기 with dblquad
3. 삼중 적분(Triple Integral) 계산하기 with tplquad
1. 일반 적분 계산하기 with quad
1) 기본
quad를 사용하면 일반적인 적분 계산이 가능하다. quad는 첫 번째 인자로 적분하고자 할 함수를 넣고, 두 번째, 세 번째 인자의 각각 적분 구간의 시작 값과 끝 값을 넣어준다. quad는 적분 값과 오차를 튜플로 리턴하게 된다.
아래 코드는
$$\int_{0}^1x^2dx$$
를 계산한다.
def f(x):
return x**2
result = quad(f, 0, 1) ## 적분 결과(적분값, 오차)
print('적분값 :', result[0])
print('오차 :', result[1])
quad는 무한대를 갖는 적분 구간도 계산 가능하다. 아래 코드는
$$\int_{0}^\infty e^{-x}dx$$
를 계산한다.
def g(x):
return np.exp(-x)
result = quad(g, 0, np.infty)
print('적분값 :', result[0])
print('오차 :', result[1])
2) 부분 인자 사용
예를 들어 다음을 적분한다고 해보자.
$$ I(a, b) = \int_{0}^4(ax^2+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를 반복 사용하면 이중 적분 그리고 더 나아가 다중 적분도 가능하다. 여기서는 아래의 적분 값을 계산해보는 방법을 알아보자.
$$\int_0^\infty \int_1^\infty \frac{e^{-xt}}{t^3}dtdx$$
먼저 적분 함수 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는 적분하고자 할 함수와 바깥 적분 구간 시작과 끝, 안쪽 적분 구간 시작과 끝을 인자로 받는다. 아래 코드는
$$\int_0^{0.5}\int_0^{1-2y}xydxdy$$
를 계산한다.
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와 유사하다. 삼중 적분이므로 구간이 하나 더 추가되어야 한다.
아래 코드는
$$\int_0^3\int_0^2\int_0^1(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 |
댓글