MATLAB 원주율 - MATLAB wonjuyul

Main Content

구문

설명

예제

모두 축소

파이의 값

π의 값을 소수점 이하 15자릿수를 갖는 배정밀도로 반환합니다.

원의 면적

구의 곡면 면적과 부피

반지름이 5인 구의 곡면 면적과 부피를 계산합니다.

확장 기능

C/C++ 코드 생성 MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

스레드 기반 환경 MATLAB®의 backgroundPool을 사용해 백그라운드에서 코드를 실행하거나 Parallel Computing Toolbox™의 ThreadPool을 사용해 코드 실행 속도를 높일 수 있습니다.

이 함수는 스레드 기반 환경을 완전히 지원합니다. 자세한 내용은 스레드 기반 환경에서 MATLAB 함수 실행하기 항목을 참조하십시오.

이러한 관계가 성립되지요

그럼 이를 염두해 보고 문제를 풀어보겠습니다.

처음이니 차례차례 갈께요.
개념적으로 이루어지는 순서는 이렇습니다.

1. 우선 정사각형 내에서 난수제조기를 이용해서 한 점을 뽑는다
2. 이 점이 원안에 들어가는지 확인한다
3. 무수히 많이 반복해서 (들어간 점들/총 점의 갯수)를 이융해 p를 구한다
4. 4*p로 파이를 계산한다

참 쉽지요?

그럼 한줄한줄 가보겠습니다.

1. 우선 정사각형을 정의해야합니다.

xy좌표계에 가장 쉽게 할 수 있는 것은

x, y각각 -1에서 1까지 이지요.

그러면 난수제조기로 -1에서 1 사이에 균일분포된 점들을 뽑아야합니다

두개를 뽑아 하나는 x 하나를 y라고 부르면 됩니다.

그럼 첫번째 문제:

이렇게 균일분포된 (x,y)행 벡터를 만들어보세요

(rand를 이용해야 합니다. rand는 0에서 1까지 균일분포되어있기 때문에
-1에서 1로 바꾸려면 약간의 창의성이 필요합니다. help rand를 쳐보면 도움될 수도 있습니다.)

(답은 아래에 흰글씨로 써놓았습니다.)

>> xy=2*rand(1,2)-1
 
xy =
 
   -0.7460    0.8268

2. 1에서 뽑은 이 (x,y)가 원 안에 들어가는지 판단하는 function을 쓰시오
input에 2개의 숫자가 들어가고 output에는 원 안에 들어갈 시
1, 들어가지 않을 시 0이 나오도록 합니다.

(function [check]=함수이름(x,y) 로 시작합니다)

function [check]=circle_check(x,y)
if (x.^2+y.^2)<=1
    check=1;
else
    check=0;
end
 
end

 3. 새로운 script파일을 작성해 이 무작위로 정사각형 내에서 점을 100번 뽑은 후
(2) 에서 작성한 함수를 이용, 원 안에 몇번 들어가는지 세어 보시오

count=0;
for i=1:100
    xy=2*rand(1,2)-1;
    circle_result = circle_check(xy(1),xy(2));
   
    count=count+circle_result;
end
count

 자 이부분이 다소 난해합니다.

우선 count=0으로 정의했는데요
여기에선 몇번나오는지 셀 수 있도록
counter의 개념으로 정의했습니다.
앞으로 원 안에 들어가면 1씩 더할 것입니다.

그리고 for 문을 이용해 i=1:100, 즉 100번 돌립니다.

xy=2*rand(1,2)-1은 (1)에서 썼던 것이지요

circle_result = circle_check(xy(1), xy(2))에서는

(2)에서 작성한 함수를 이용하고

xy라는 행벡터의 첫번쨰 요소를x, 두번째 요소를 y에 넣습니다.

그리고 함수의 결과값을 circle_result에 일단 저장합니다.

원에 들어갔으면 circle_result가 1, 들어가지 않았으면 0이겠지요?

이것을 count=count+cirle_result을 이용해

원에 들어갈때마다 count에 1씩 더해줍니다.

0일경우에도 더하기는 하지만 0을 더하니 똑같겠지요?

그리고 마지막에 count를 입력해주어 결과값을 출력합니다

count =
 

    76

저의경우엔 76번 들어갔네요

4. (3)에서 쓴 script를 고쳐 몇번 들어갔는가가 아니라
100번중 몇번인지 확률을 구하고 확률에 4를 구해 파이 값을 추산해보시오

(마지막줄만 고치시면 됩니다)

count=0;
for i=1:100
    xy=2*rand(1,2)-1;
    circle_result = circle_check(xy(1),xy(2));
   
    count=count+circle_result;
end
my_pi=count/100*4

 마지막줄에 my_pi라는 새로운 변수로 정의했습니다.
pi는 이미 정의되어있으니 피하기로 했구요

간단하게 횟수/100*4를 이용했습니다.

한번 돌려볼께요

my_pi =
 

    3.2400

5. (4)에서 쓴 script를 고쳐 100번이 아닌 n번 반복하게 하며
n은 첫번째줄에 정의하도록 하시오

n=1000;
count=0;
for i=1:n
    xy=2*rand(1,2)-1;
    circle_result = circle_check(xy(1),xy(2));
   
    count=count+circle_result;
end
my_pi=count/n*4

보시면 첫째줄에 n=1000이라고 정의할 수 있는 행을 넣었고
for 문에 1:n까지

그리고 my_pi=count/n*4로 바꾸어주었습니다.

이렇게하면 처음에 n을 원하는 숫자로 바꾸어 매트랩이 몇번 반복할지 정할 수 있습니다.

한번 실행해보겠습니다.

my_pi =
 

    3.1240

횟수가 많아지니 원주율에 조금 가까워졌네요

6. n을 백만으로 돌려서 파이의 근사값을 구하시오

n=1000000;
count=0;
for i=1:n
    xy=2*rand(1,2)-1;
    circle_result = circle_check(xy(1),xy(2));
   
    count=count+circle_result;
end
my_pi=count/n*4

 자 편리하게 n만 1,000,000으로 바꾸었습니다.

돌려보면 조금 시간이 걸립니다.

my_pi =
 

    3.1418

원주율의 실제갑은 3.14159265정도 되니

제법 가깝습니다.

--

굉장히 간단한 첫번째 문제를 풀어봤는데요

어때요 어렵지 않죠?

실제로 이러한 방식으로 파이를 구하는 것은 매우 비효율적이며
일반적으로 컴퓨터가 계산하는 것은 더 빠르게 수렴하는 수열이 있지만

for문과 rand를 써보기 위해 예제를 만들었습니다

(사실 난수만으로 이루어진 10000*2의 벡터를 이용하는게 훨씬 계산이 빠르지만
연습을 위행 일단 이렇게 진행했습니다)

앞으로 조금씩 난이도를 올려가면서 예제를 준비해보려 하겠습니다

읽어주시는분께 감사드립니다.