NAVER

질문 몬테카를로기법 활용분야
비공개 조회수 11,048 작성일2008.04.10

몬테카를로 기법 활용분야에는 어떤게 있죠?

여러개 적어주세요

 

그리고 몬테카를로 기법으로 파이 값 구하는걸요

매트랩으로 코드작성해야되는데

제가 매트랩 쓸줄몰라요 코드 좀 작성해주세요.ㅜ

 

내공 100 걸테니 자세히좀 답변해주세요.

프로필 사진

답변자님,

정보를 공유해 주세요.

1 개 답변
1번째 답변
프로필 사진
탈퇴한 사용자 답변
 
몬테 카를로 법이란, 시뮬레이션 테크닉의 일종으로, 구하고자 하는 수치의 확률적 분포를 반복 가능한 실험의 통계로부터 구하는 방법을 가리킵니다. 확률변수에 의거한 방법이기 때문에, 1949년 Metropolis Uram이 모나코의 유명한 도박의 도시 Monte Carlo의 이름을 본따 명명하였습니다.

간단하면서도 유명한 예로, 몬테 카를로 법을 이용한 파이(∏)의 계산법이 있습니다.
먼저 아래 그림과 같이 정사각형 안에 한 꼭지점을 중심으로 사분원을 한개 그립니다. 이때 정사각형의 전체 넓이를 1이라고 하면 원의 넓이는 ∏/4 가 되겠지요. 이제 컴퓨터로 난수를 발생하여 무작위로 정사각형 내부에 점을 찍습니다.

그리고 정사각형의 꼭지점과의 거리를 계산하여 점이 사분원의 내부에 있는지 외부에 있는지를 판단합니다. 예를 들어 전체 10만 개의 점을 찍었다고 할 때 이 중 n개가 사분원의 내부에 있었다면 두 숫자의 비율, 즉 n/10만의 값은 넓이의 비인 ∏/4에 근접하리라고 예측할 수 있습니다.
이 값을 더 많은 점을 찍어 실험할수록 정밀해지겠지요.

이와 같이 많은 수의 실험을 바탕으로 통계 자료를 얻어 그 자료로부터 역산하여 어떤 특정한 수치나 확률분포를 구하는 방법을 몬테 카를로 법이라고 합니다.
특성상 통계자료가 많을수록, 입력값의 분포가 고를수록 결과의 정밀성이 보장된다는 것을 알 수 있습니다. 때문에, 대부분 컴퓨터를 이용하여 분석이 행해집니다.
몬테 카를로 법의 특징으로는, 우선 적용하기 쉽다는 점이 있습니다. 실제로 파이의 값을 정확히 구하기 위해서는 무한급수에 관한 지식과 오차범위에 관한 지식 등 다양한 배경 지식을 바탕으로 알고리즘을 만들어 그 값을 계산해야 하지만, 몬테 카를로 방법은 그런 모든 절차와 관계없이 짧은 컴퓨터 프로그램 몇줄만으로 쉽게 수치를 얻을 수 있습니다.
이런 장점은 이론적 배경만으로는 계산하기 어려운 수치들 - 예를 들면 복잡한 형태를 가진 표면에 빛을 비추었을 때 반사광의 분포, 복잡한 분자계의 화학적 특성 분석, 핵융합로에서 중성자 빔이 반응에 미치는 영향 등 - 을 직접 구할 필요가 있을 때 빛을 발합니다. 때문에 컴퓨터를 이용한 분석이 발달한 최근에는 거의 모든 과학과 공학 분야에 걸쳐 몬테 카를로 법이 광범위하게 사용되고 있습니다.
몬테 카를로 방법을 통한 실험을 설계할 때는, 입력값의 확률분포와 실험의 수학적 모델링이 정확하지 않으면 몬테 카를로 방법은 무의미하다는 점에 주의하여야 하며, 난수의 분포가 분석에 큰 영향을 미치므로 필요한 난수의 범위와 분포에 따른 올바른 난수 생성 함수에도 주의를 기울여야 합니다.
 

설명( 해외문서의 그림을 참고하시기를 바랍니다. )

가로 세로가 각각 R인 정사각형을  생각할 때
이 사각영역 안에는 대략 R*R(정확히는 (R+1)*(R+1)이지만 R을 무한히 크게한다면
 (R+1)/R == 1 이됩니다)개의 점들이 존재합니다.

이 사각영역안에 있는 점좌표를 (X,Y)라고 한다면
0 <= X <= R, 0 <= Y <= R 인 조건을 만족하는 점들일 것입니다.

 

난수 발생기를 사용해서 위 조건을 만족하는 X,Y값을 생성하여
해당 좌표에 점들을 찍는다면
사각 영역안에 존재하는 모든 점들 각각이 선택될 확률은 모두
같고 1/(사각영역안의 점의 수)이 될 것입니다.

 

이 때 이 정사각형 영역안에 사분원(四分圓)을 생각한다면 

사각영역안의 점들의 수만큼의 횟수에 걸쳐

난수로 좌표를 생성하여 점들을 찍는다고 한다면


이론적으로는 이 사분원의 넓이크기만큼 수의 점들이
이 사분원 안에 찍힐 것을 기대할 수 있습니다.

 

실제로는 난수로 발생된 한쌍의 좌표 (X,Y)가

사분원안에 존재하는지여부( X^2 + Y^2 <= R*R)를 검사하여
그 수 n를 계수(카운트)하면 아래와 같은 식이 성립합니다.

 

사분원 안에 찍힌 점의수(=n) / 난수발생회수(=N) = 사분원의 넓이(=s) / 정사각형의

넓이(=S)


s = PI*R*R/4, S = R*R
n/N = s / S = PI/4


PI에 관하여 풀면
PI = 4*n/N 이라는 식을 얻게 되어서 PI계산이 가능하게됩니다.

*/

 

#include "stdio.h"
#include "time.h"
#include "stdlib.h"

 

// 흐름도는 아래 #의 순번을 참고하시기를 바랍니다.
int main(void)
{
   int R, R2, X, Y;
   double PI;

   int N, n;
   int i;
   int query;

 

   // 초기화
   srand( (unsigned int)time(NULL) );

   while( 1 )
   {
      // #1. 입력
      n = 0;
      printf( "\n정사각 영역의 크기 R 입력 : " );
      scanf( "%d", &R );
      R2 = R*R;

      printf( "시행 횟수 N 입력          : " );
      scanf( "%d", &N );

 

      // #2. 계산
      // N회에 걸쳐 난수발생으로 점좌표(X,Y)를 생성합니다.
      for( i = 0; i < N; i++ )
      {
         X = rand() % (R+1);  // 0부터 R
         Y = rand() % (R+1);

 

         // 그 좌표가 사분원안에 존재하는지를 검사하고 카운트합니다.
         if( X*X + Y*Y <= R2 )
            n++;
      }

 

      // #3. 출력( 시행으로 얻어진 결과값을 이용하여 PI값을 계산합니다. )
      PI = 4. * n / N;
      printf( "사각형 R : %d, 시행회수 : %d일 때 PI = %lf\n", R, N, PI );

      printf( "종료하시려면 Q/q키를 계속하시려면 그 밖의 아무키나 누르십시오 : " );
      fflush(stdin);

 

      if( (query = getchar())==(int)'Q' || query == (int)'q' )
       break;
   }
  return 0;
 }

 

/*

실행예 ( 시행횟수(반복회수) N의 크기를 증가하면서 테스트한 결과 )

 


2008.04.10.

도움이 되었다면 UP 눌러주세요!
UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.