Python/SciPy

SciPy 정적분과 동적분 (quad, dblquad) 이해하기

임베디드 친구 2025. 12. 8. 19:31
반응형

SciPy 정적분과 동적분 (quad, dblquad) 이해하기

1. 서론

적분은 수학과 과학의 다양한 분야에서 널리 사용되는 중요한 도구입니다. 특히, 신호 처리, 물리학, 생물학, 경제학 등 여러 분야에서 어떤 함수의 면적, 길이, 부피 등을 구하는 데 필수적인 역할을 합니다. Python에서는 SciPy 라이브러리를 통해 간편하게 수치적분을 수행할 수 있습니다. 이번 포스팅에서는 SciPy의 integrate 모듈을 활용해 정적분과 동적분을 수행하는 방법에 대해 알아보겠습니다.

2. 적분의 기본 개념

적분은 함수의 그래프 아래에 있는 면적을 구하는 과정입니다. 크게 다음과 같이 두 가지로 나눌 수 있습니다.

  • 정적분 (Definite Integral): 주어진 구간
    $[a, b]$ 내에서 함수 $f(x)$의 면적을 구하는 것
  • 동적분 (Multiple Integral): 2차원 이상의 다중 구간에서 면적이나 부피를 구하는 것

SciPy에서는 quaddblquad 함수를 통해 각각 1중 적분과 2중 적분을 쉽게 수행할 수 있습니다.

3. SciPy의 quad를 이용한 정적분

3.1 quad 함수 소개

quad는 SciPy에서 가장 기본적인 1중 적분 함수입니다. 다음과 같이 사용됩니다.

from scipy.integrate import quad

def integrand(x):
    return x**2

result, error = quad(integrand, 0, 2)
print(f"적분 결과: {result}")
print(f"오차 추정값: {error}")

3.2 quad 함수의 주요 매개변수

  • func: 적분할 함수
  • a, b: 적분 구간의 하한과 상한
  • args: 추가 인수 (옵션)
  • epsabs, epsrel: 절대 및 상대 오차 허용값 (옵션)

3.3 예제: 정적분 수행

아래는 $ \int_0^1 (3x^2 + 2x + 1) dx $를 계산하는 예제입니다.

from scipy.integrate import quad

def func(x):
    return 3 * x**2 + 2 * x + 1

result, error = quad(func, 0, 1)
print(f"적분 결과: {result}")
print(f"오차 추정값: {error}")

결과:

적분 결과: 2.3333333333333335
오차 추정값: 2.590520390792032e-14

3.4 무한 구간 적분

quad는 무한대 구간에서도 적분을 수행할 수 있습니다.

예: $ \int_0^\infty e^{-x} dx $

import numpy as np
from scipy.integrate import quad

def exponential_decay(x):
    return np.exp(-x)

result, error = quad(exponential_decay, 0, np.inf)
print(f"적분 결과: {result}")
print(f"오차 추정값: {error}")

결과:

적분 결과: 1.0
오차 추정값: 5.842605999138044e-11

4. SciPy의 dblquad를 이용한 2중 적분

4.1 dblquad 함수 소개

2차원 적분(다중 적분)은 적분 영역이 2차원 평면을 따라 확장되는 경우를 의미합니다. SciPy의 dblquad 함수는 다음과 같이 사용됩니다.

from scipy.integrate import dblquad

def integrand(y, x):
    return x * y

result, error = dblquad(integrand, 0, 1, lambda x: 0, lambda x: 2)
print(f"2중 적분 결과: {result}")
print(f"오차 추정값: {error}")

4.2 dblquad 함수의 주요 매개변수

  • func(y, x): 적분할 함수 (내부 적분 변수부터 순서대로 작성)
  • a, b: 외부 적분 변수(x)의 구간
  • gfun, hfun: 내부 적분 변수(y)의 구간을 정의하는 함수

4.3 예제: 직사각형 영역에서의 2중 적분

$ \int_0^1 \int_0^2 (x y) dy dx $를 계산하는 예제입니다.

from scipy.integrate import dblquad

def integrand(y, x):
    return x * y

result, error = dblquad(integrand, 0, 1, lambda x: 0, lambda x: 2)
print(f"2중 적분 결과: {result}")
print(f"오차 추정값: {error}")

결과:

2중 적분 결과: 1.0
오차 추정값: 1.1102230246251565e-14

4.4 비정형 영역에서의 2중 적분

삼각형 영역 $0 \leq x \leq 1$, $0 \leq y \leq x$에서 $ x^2 + y^2 $를 적분하는 예제입니다.

from scipy.integrate import dblquad

def integrand(y, x):
    return x**2 + y**2

result, error = dblquad(integrand, 0, 1, lambda x: 0, lambda x: x)
print(f"비정형 영역 2중 적분 결과: {result}")
print(f"오차 추정값: {error}")

결과:

비정형 영역 2중 적분 결과: 0.33333333333333337
오차 추정값: 3.700743415417188e-15

5. 성능과 정확도 개선 방법

  1. 적절한 오차 허용값 설정: epsabsepsrel을 조정하여 계산 정확도를 높이거나 속도를 개선할 수 있습니다.
  2. 구간 분할: 적분 구간을 여러 개의 작은 구간으로 나누어 정확성을 높일 수 있습니다.
  3. 벡터화된 함수 사용: NumPy를 활용하여 적분 속도를 개선할 수 있습니다.

예: epsrel=1e-8로 설정하는 방법

result, error = quad(func, 0, 1, epsrel=1e-8)
print(f"정확도를 높인 적분 결과: {result}")

6. 결론

이번 포스팅에서는 SciPy의 quaddblquad 함수를 이용한 정적분과 동적분 방법을 살펴보았습니다. quad를 이용하면 1차원 적분을, dblquad를 이용하면 2차원 적분을 쉽게 수행할 수 있으며, 적분 영역과 오차를 세부적으로 조정함으로써 보다 정확하고 효율적인 결과를 얻을 수 있습니다.

SciPy는 이러한 적분 작업을 간단하고 직관적으로 수행할 수 있도록 도와주는 강력한 도구입니다. 실제 프로젝트나 연구에서도 자주 활용되는 기능이므로, 다양한 예제를 통해 꾸준히 연습해보는 것을 권장합니다.

반응형