Life Logging


또 다른 \( \pi \) 에 대한 근사값

02/03/2016
어제 \( \pi \) 를 정의대로 원둘레를 이용하여 근사한 후 또 \( \pi \) 가 들어간 게 어디 없다 생각해보다가 반지름이 \( r \) 인 원의 넓이가 \( \pi \cdot r^{2} \) 인 것을 이용할 방법도 떠올랐다.
먼저 반지름이 1인 원을 그린 다음 1 사분면의 \( x \) 축을 \( n \) 개로 분할한다.

원은 좌표 평면에서 \( x^{2} + y^{2} = 1 \) 위에 있으므로 \( y \) 가 \( \sqrt{ 1 - (x좌표)^{2}} \) 보다 작으면 원의 내부에 존재하게 된다.

이제 [0, 1] 구간에서 \( \frac{1}{n} \) 단위로 \( y \) 좌표를 자른 후 \( x \) 가 \( \frac{k}{n} \) 일 경우 \( \sqrt{ 1 - (\frac{k}{n})^{2}} \) 보다 작은 점 - 아래 그림에서는 동그라미로 표시된 격자들의 수를 전체 격자의 수로 나누면 사분원의 넓이의 근사값이 된다.

위의 시나리오를 코드로 표현하면 아래와 같다.
#!/usr/bin/perl
# aaction.pl [x 축 격자수]

use strict;
use warnings;

my $n = shift;
$n = 100 unless(defined($n));
my $in_count = 0;
my $y = 1;
foreach my $k (1..$n){
  my $x = $k/$n;
  while($x**2 + $y**2 > 1){
    $y -= 1/$n;
  }
  $in_count += $y * $n;
}
printf "pi is %s\n", 4*$in_count/($n**2);
결과는 아래와 같다.
$ perl aaction.pl 10
pi is 2.72
$ perl aaction.pl 100
pi is 3.1016
$ perl aaction.pl 1000
pi is 3.137548
$ perl aaction.pl 10000
pi is 3.1411902
$ perl aaction.pl 100000
pi is 3.1415525416
$ perl aaction.pl 1000000
pi is 3.141588649676
$ perl aaction.pl 10000000
pi is 3.14159225309212
$ perl aaction.pl 100000000
pi is 3.14159261741863
대충 이렇게 생각하다가 갑자기 아 뭐 이렇게 힘들게 하고 있나, 그냥 [0,1] 구간으로 정사각형을 만든 후 랜덤하게 점을 찍어서 원 안에 들어가는지 - 다시말해 원점과의 거리가 1보다 큰지 비교하면 되지 않나 란 생각이 들었다. 도식하자면 아래와 같으며

코드는 아래와 같다.
#!/usr/bin/perl
# baction.pl [랜덤하게 수행할 횟수]

use strict;
use warnings;

my $n = shift;
$n = 100 unless(defined($n));

my $in_count = 0;
foreach my $k (1..$n){
  my $x = rand(1);
  my $y = rand(1);
  if($x**2 + $y**2 < 1){
    $in_count ++;
  }
}
printf "pi is %s\n", 4*$in_count / $n;
보면 알겠지만 그냥 변이 1인 정사각형안에 점을 랜덤하게 찍어대서 원점과의 거리가 1보다 작은 것들의 수를 구한다.
결과는 아래와 같다.
$ perl baction.pl 10
pi is 3.6
$ perl baction.pl 100
pi is 2.84
$ perl baction.pl 1000
pi is 3.212
$ perl baction.pl 10000
pi is 3.1496
$ perl baction.pl 100000
pi is 3.14396
$ perl baction.pl 1000000
pi is 3.14026
$ perl baction.pl 10000000
pi is 3.142596
$ perl baction.pl 100000000
pi is 3.14151104
이제 당분간 \( \pi \) 는 생각이 안 날 것 같다.