본문 바로가기
프로그래밍/SciPy

[SciPy] 2. 적분 계산하기 (feat. quad, dblquad, tplquad)

by 부자 꽁냥이 2022. 8. 28.

SciPy는 적분 계산 관련된 기능을 제공하고 있다. 이번 포스팅에서는 Scipy에서 제공하는 적분 관련 기능인 quad, dblquad, tplquad 사용 방법에 대해서 알아본다.

 

- 목차 -

1. 일반 적분 계산하기 with quad

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])

 


댓글


맨 위로