Python/Utils

파이썬 적분 구현, 면적 구하기 예제(부정적분, 정적분, 구분구적법)

jimmy_AI 2022. 6. 29. 11:08
반응형

Python 적분, 면적 계산하기

파이썬에서 부정적분, 정적분 및 구분구적법을 계산하는 방법을 살펴보고

그래프 아래의 면적을 적분을 통해서 구하는 방법까지 다루어 보겠습니다.

 

 

부정적분 계산

예시로, 아래와 같은 간단한 함수를 적분하는 예시를 살펴보겠습니다.

$$\ f(x) = e^x + 2 x^2 + 3x + 4$$

적분 계산은 sympy 모듈을 통하여 진행되는데, 먼저 식 표현은 아래와 같이 해주시면 됩니다.

import sympy as sy

x = sy.symbols('x') # x를 변수로 사용함을 선언

f = sy.exp(x) + 2 * x ** 2 + 3 * x + 4
f

이제 표현해둔 식에서 다음과 같은 부정적분의 계산을 해보겠습니다.

$$\ \int e^x + 2 x^2 + 3x + 4\; dx$$

sympy 모듈의 integrate 함수에 (함수, 변수) 형태로 넣어주시면 부정적분 계산이 완료됩니다.

sy.integrate(f, x)

 

반응형

 

정적분 계산

부정적분 계산 결과를 이용하여 주어진 그래프 아래의 면적에 해당하는

정적분 값도 계산이 가능합니다.

 

예시로, 위의 함수에서 2에서 5까지 정적분을 진행한 다음과 같은 값을 계산해 보겠습니다.

$$\ \int_{2}^{5} e^x + 2 x^2 + 3x + 4\; dx$$

값의 대입은 선언한 함수의 subs 메소드에서 subs(변수, 값) 형태로 지정해주시면 됩니다.

F = sy.integrate(f, x)

# x에 대하여 2~5 범위에서 정적분 값 계산
F.subs(x, 5) - F.subs(x, 2)

만일, 소수점 형태로 결과를 반환받고 싶다면 evalf() 메소드를 추가 실행해주시면 됩니다.

(F.subs(x, 5) - F.subs(x, 2)).evalf()

 

 

구분구적법 계산

구분구적법은 원하는 정적분의 범위를 n등분 하여

각 눈금 사이에서의 직사각형 넓이의 합으로 전체 면적을 근사하는 방법입니다.

 

위에서 계산했던 함수와 정적분을 numpy 모듈을 통하여 아래와 같이

구분구적법으로 다시 계산해볼 수 있습니다.

import numpy as np

numbers = 10000 # 등분할 눈금의 숫자

x_lin = np.linspace(2, 5, numbers) # 2 ~ 5범위를 10000등분한 x좌표

def f(x): # 함수 선언
    return 2 * x ** 2 + 3 * x + 4 + np.exp(x)

area = 0 # 면적을 저장할 변수

for i in range(numbers - 1): # 눈금 수 - 1까지임에 유의
    x_1 = x_lin[i] # 눈금 앞쪽 x좌표
    x_2 = x_lin[i+1] # 눈금 뒤쪽 x좌표
    area += (x_2 - x_1) * f(x_2) # 각 눈금 사이의 직사각형 넓이

print(area) # 262.5529106476566

정적분으로 계산한 결과와 거의 유사한 값이 반환된 것을 볼 수 있었습니다.