카테고리 없음

구분구적법을 이용한 원주율을 구하기

송규 2023. 7. 3. 12:27

원주율을 구하는 방법은 다양하게 존재합니다. 예를 들면 몬테카를로 방법을 이용하여 반복된 무작위의 난수들을 통해 함수의 값을 근사할수도 있고, arctan의 매클로린 급수를 이용하여 tan(pi/4)=1이라는 것을 통해 arctan(1)=pi/4임을 이용해서 원주율을 구할수도 있습니다.

저는 원주율을 구하는 또다른 방법인 구분구적법을 이용하는 방법을 구현해보았습니다.

 

구분구적법이란 수학적 함수의 정적분을 근사적으로 계산하는 수치적인 방법 중 하나입니다.

이 방법은 함수를 작은 구간으로 나누고, 각 구간에서 함수를 대표할 수 있는 점을 선택하여 해당 점에서의 함수값을 이용하여 정적분 값을 근사적으로 계산하는 것입니다.

쉽게 말하면 함수의 정적분을 구간을 작은 단위로 나누어 각 구간에서의 함숫값을 계산한 후에 이를 모두 더하여 전체 구간에서의 근사적인 정적분 값을 얻어내는 것입니다. 구간을 더욱 작게 나눌수록 정확학 결과를 얻을 수 있는 특징이 있습니다.


그래서 이런 구분구적법으로 어떻게 원주율을 구할까요?

 

출처: https://wikidocs.net/21265

반지름이 1인 원을 놓고 제 1사분면위의 영역만 넓이를 구해서 원의 넓이를 알아낸 뒤에 원주율을 알아낼 수 있는 것입니다. 

원$x^2 + y^2 = 1$일때를 예시로 들어서 설명하면 $y=\sqrt{1-x^2}$인 것을 알수 있고,

따라서 $x_k$일때의 사각형의 높이는 $h=\sqrt{1-(\frac{k}{n})^2}$입니다.

따라서 $x_k$일때의 사각형의 면적은 $\frac{1}{n} \times h = \frac{1}{n} \sqrt{1-(\frac{k}{n})^2}$ 이므로 이러한 사각형을 n개의 넓이를 합해주면 원의 넓이가 나옵니다.

 
#include <stdio.h>

double cal(int n) { // 구분구적하는 함수
    double step = 1 / n; // 구간의 길이
    double sum = 0;
    double x;

    for (int i = 0; i < n; i++) {
        x = (i + 0.5) * step; // 구간의 중앙 값
        sum += 4 / (1 + x * x); // 함수 값 계산 및 합산
    }

    return step * sum; // 근사적인 원주율 값 반환
}

int main() {
    int n = 1000000; // 구간의 수
    double pi = cal(n);

    printf("구분구적법을 이용한 원주율의 근사값 : %f\n", pi);

    return 0;
}

위의 코드는 원의 1/4부분의 넓이를 구분구적법으로 계산하여 원주율을 근사하는 코드로 코드를 작성할때 딱히 어려웠던 부분은 없는 것 같습니다.

 

위의 코드로 원주율을 근사해보니 3.141593의 값을 얻었습니다.

 

수학시간에 배운 구분구적법과 정보에서 배운 C언어를 융합하여 원주율을 계산해보는 과정에서 수학과 정보에 대해 더욱 이해가 잘되었던것 같고 구분구적법을 사용하여 얻은 근사값은 원주율의 정확한 겂과 비교해보면 차이가 있는데, 이 차이는 구분구적법에 사용한 구간의 개수나 정확도에 따라 달라진다는 것을 알 수 있었고, 이 코딩을 통해 수학적인 근사 방법의 한계와 정확성에 대해 생각해보는 시간이 되었습니다!!

 

이상으로 6월 정융탐을 마치겠습니다. 감사합니다.

 

참고자료: https://wikidocs.net/21265