구분구적법

반응형
    반응형

    곡선의 넓이 구하기

    곡선의 넓이를 구하는 방법은 고대부터 이어오는 연구였는데 적분이라는 개념으로 통합되면서 현재 우리가 적분으로 곡선의 넓이를 구하게 되었습니다.
    결론만 요약해서 얘기하면 극한의 개념이 있기 전까지는 적분이라는 것을 쓸 수 없었는데 극한의 개념이 전파되면서 적분을 쓸 수 있게 되었습니다.

    이번 포스팅은 적분의 전형태인 구분구적법에 대한 얘기를 쓸까 합니다. 구분구적이라는 말은 한자어로 measuration by parts를 한자로 번역한 것입니다. 여기서 구분은 말그대로 '구분'한다는 것인데 수학적 관점으로 보면 쪼갠다는 의미로 받아들일 수 있습니다. 작은 도형으로 만드는 것이지요. 구적법은 meansuration 으로 면적을 구하는 방법이라 합니다.

    즉, 구분구적법은 어떤 도형의 넓이 또는 부피를 구하기 위해 여러개의 도형으로 나누어 면적을 구한다는 뜻이 됩니다.
    여기에 극한으로 쪼개논 도형의 갯수를 무한으로 늘여 합을 내면 정적분이 됩니다.

    그래서 곡선의 도형이 있을 때 넓이를 구하는 가장 간단하고 잘 아는 방법인 직사각형 넓이 구하는 방법을 이용해서 근사치를 구하게 됩니다. 쪼개놓은 각 넓이(밑변X높이)를 합쳐서 곡선의 넓이의 근사치를 구합니다.

    수학적 표현

    수학적으로 표현하면 다음과 같습니다.
    곡선(f(x))을 그려놓고 a~b까지의 범위의 넓이를 구한다고 하면
    밑변에 해당하는 x의 값을 일정하게 쪼갭니다. 이를 파티션이라고 하는데 n개를 나눈다고 하면 밑변에 해당하는 $\triangle x= \frac{b-a}{n}$ 이 되고 높이는 함수 f(x)가 됩니다.
    파티션의 각 값을 $a=x_0, x_1, ..., x_n=b$ 라 하면 각 높이는 $f(x_i)$
    이 됩니다. 여기서 i를 어떤 형식을 두냐에 따라 사각형이 곡선위를 덮는 사각형으로 될수도 있고 아래로 채워가는 형대로 될 수도 있습니다.

    곡선위를 덮는 사각형이 되는 경우 위 그림과 같다면 $fㅅ(x_0),f(x_1),...,f(n-1)$ 이 높이가 됩니다. 밑변은 똑같은 크기로 나눴으므로 크기가 같습니다.
    따라서,
    $\sum_{i=1}^{n}f(x_i) \triangle x$
    입니다.

    작은 사각형으로 한다면 i의 번호가 바뀝니다.
    $\sum_{i=0}^{n-1}f(x_i) \triangle x$
    입니다.

    여기까지가 구분구적법의 내용이고 여기서 극한의 개념을 이용해 쪼개는 숫자인 n을 무한으로 하면 곡선의 넓이와 같아진다는 아이디어를 정리한 내용이 리만합입니다. 그 후 적분으로의 정의로 이어집니다.

    파이썬으로 구현

    이 개념을 파이썬으로 구현해보겠습니다.
    보통 데이터는 함수로 주어지는 게 아닙니다.
    그렇기 때문에 사실상 못 쓰는 것이긴 하지만 내가 모델링을 해서 그럴듯한 함수를 만든다면 어느정도 신뢰성있는 수치가 나올 수 있습니다. 물론 이론적으로 완성된 함수인 경우에는 예외가 되겠지만요.

    곡선의 함수를 아는 경우

    곡선의 함수를 안다면 다음과 같이 합니다.

    def rectangle_rule(f, a, b, n):
    """
      f 함수의 a와 b 사이의 면적을 구한다.
    
      Args:
        f: 함수
        a: 구간 시작점
        b: 구간 끝점
        n: 구간 개수
    
      Returns:
        f 함수의 a와 b 사이의 면적
      """
      h = (b - a) / n
      area = 0
      for i in range(n):
        area += f(a + i * h) * h
      return area
    
    import math
    f = lambda x: x ** 2
    a = 0
    b = 1
    n = 100
    rectangle_rule(f, a, b, n)

    곡선의 함수를 모르는 경우(데이터만 있는 경우)

    데이터만 있는 경우는 함수를 몰라서 구분구적법 구현이 불가능합니다. 하지만 임시로 사각형을 만들어서 넓이를 구한다면 아예 불가능한 것도 아닙니다. 다만, 추천하지는 않습니다. regression같은 방식을 이용해서 곡선의 함수를 구한후 면적을 구하는 작업으로 넘어가는 것을 추천합니다. 이건 말그대로 할 수 있다는 것만 보여주는 겁니다.

    import numpy as np
    
    def Area(data, x_min, x_max):
      """
      data에 대해 x_min에서 x_max까지의 면적을 구한다.
    
      Args:
        data: 데이터
        x_min: x축의 최소값
        x_max: x축의 최대값
    
      Returns:
        data에 대해 x_min에서 x_max까지의 면적
      """
      n = len(data)
      h = (x_max - x_min) / n
      area = 0
      for i in range(n):
        area += data[i] * h
      return area
    
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 데이터 생성
    data = np.random.randint(0, 10, 1000)
    
    # 그래프 생성
    plt.plot(data)
    
    # 면적 구하기
    area = Area(data, 0, 10)
    
    print(area)

     

    마치며

    구분구적법은 현재는 자주 쓰이진 않고 있습니다.
    방식이 간단해 오차도 계산하기도 편하기 때문에 함수만 잘 안 다면 임시로 써볼만한 모델링을 만들 수는 있을겁니다.

    댓글

    Designed by JB FACTORY

    ....