terça-feira, 30 de abril de 2013

Estimando o valor de pi usando um quadrado, um círculo e probabilidade


Existe uma técnica bem legal de se estimar o valor da constante π usando o quadrado e círculo abaixo:


O valor do raio do círculo é 1. Assim a área do círculo é π * r ^ 2 = π * (1 * 1) = π.
E a área do quadrado é :2 ^ 2 = 2 * 2 = 4. Só lembrando que estou usando o símbolo ^ para representar a exponenciação.

E agora nós selecionamos milhares de pontos dentro do quadrado. Para uma boa aproximação devemos fazer isso milhões de vezes. Uma vez isso feito você pode usar a seguinte fórmula para encontrar o valor de π:
π/4 = número de pontos dentro do círculo / número total de pontos

modificando a fórmula para encontrar o valor de π:
π = (número de pontos dentro do círculo * 4) / número total de pontos

Considerando-se que para obtermos um bom resultado devemos escolher milhões de pontos, seria muito demorado e entediante fazer este processo manualmente, portanto, nada melhor do que usarmos um computador para isso. E o programa em PHP abaixo faz exatamente isso:

<?php
//estimating pi using a square, a circle and probability
//better explanation at http://www.businessinsider.com/the-most-controversial-math-problems-2013-3#-46
const MAX_POINTS = 5000000;
function random_between_0_and_2() {
return (rand() / getrandmax()) * 2.0;
}
function seed_random() {
srand();
}
function prepare_to_calc_hypotenuse($number) {
return ($number < 1.0) ? 1 - $number : $number - 1;
}
function calc_pi($points_within_circle, $total_number_of_points) {
return ($points_within_circle * 4.0) / $total_number_of_points;
}
//main program
seed_random();
$points_within_circle = 0;
for($i = 0; $i < MAX_POINTS; $i++) {
//here we select a random point (x,y) within the square
$x = prepare_to_calc_hypotenuse(random_between_0_and_2());
$y = prepare_to_calc_hypotenuse(random_between_0_and_2());
//We use the hypotenuse to see if the point is within the circle or not
$hypotenuse = hypot($x, $y);
if ($hypotenuse < 1) {
$points_within_circle++;
}
}
$total_number_of_points = MAX_POINTS;
$pi = calc_pi($points_within_circle, $total_number_of_points);
echo "The approximation of pi is: $pi\n";
return 0;
view raw pi.php hosted with ❤ by GitHub


Acredito que não seja difícil entender o código. Neste exemplo selecionamos 5 milhões de pontos dentro do quadrado. A inspiração veio deste link, lá você também pode encontrar uma boa explicação de como a técnica funciona. Ou você pode usar a constante M_PI da linguagem PHP.