Calcular el valor de pi a través de una 시뮬레이션 데 몬테카를로

Las Simulaciones de Montecarlo son simulaciones que utilizan la aleatoriedad para predecir el resultado de un problema.

Permiten transformar un problema determinístico en uno no determinístico.

Convertiremos mediante simulación de Montecarlo la obtención de pi (solución determinística) en una solución estocástica.

Inicialmente se parte del conocimiento de las formulas matemáticas del área de un cuadrado y de un círculo.

Recordemos que el área de un cuadrado es base por altura y el área de un círculo es pi por radio al cuadrado.

2를 기준으로 하여 cuadrado con base y altura de 2를 정확히 확인하십시오.
Entonces podemos concluir que el radio del círculo es de 1 y a el área del cuadrado es de 4, además podemos concluir que el área del círculo es igual a pi.

En definitiva, si sabemos cuánto es el área del círculo en este problema, sabremos el valor de pi.

Para resolver este problema de forma no determinista simularemos que se lanzan o avientan muchas agujas y veremos cuántas caen fuera y cuántas dentro del circulo.
Este acercamiento nos permite tener la proporción de agujas afuera del círculo y dentro del círculo y por ende la proporción de las áreas del círculo y el cuadrado.

Agujas en cuadrado = agujas fuera del círculo

Agujas en círculo/agujas en cuadrado = 원형 영역/cuadrado 영역

Área circulo = (4 * agujas circulo) = agujas cuadrado.

Suponiendo que el centro del círculo y del cuadrado están en la coordenada 0,0
Los alfileres deberán caer dentro del rango de -1 y 1 para x y -1 & 1 para y(recordemos que el radio del círculo es 1).

Pero, ¿cómo sabemos que una aguja cayó adentro o afuera del círculo?
Usaremos el teorema de Pitágoras.
Calcularemos las hipotenusas que se forman de los triángulos, producto de los valores para y & x de las coordenadas de las agujas que se obtengan aleatoriamente.

Hipotenusas mayores a 1, significará que el alfiler o aguja cayó por fuera del círculo, hipotenusas menores o iguales a 1 son alfileres o agujas que caen dentro del círculo.

import math
# incluir estadisticas
from estadisticas import desviacion_estandar, media


def aventar_agujas(numero_de_agujas):
    adentro_del_circulo = 0

    for _ in range(numero_de_agujas):
        x = random.random() * random.choice([-1, 1])
        y = random.random() * random.choice([-1, 1])
        distancia_desde_el_centro = math.sqrt(x**2 + y**2)

        if distancia_desde_el_centro <= 1:
            adentro_del_circulo += 1

    return (4 * adentro_del_circulo) / numero_de_agujas


def estimacion(numero_de_agujas, numero_de_intentos):
    estimados = []
    for _ in range(numero_de_intentos):
        estimacion_pi = aventar_agujas(numero_de_agujas)
        estimados.append(estimacion_pi)

    media_estimados = media(estimados)
    sigma = desviacion_estandar(estimados)
    return (media_estimados, sigma)


def estimar_pi(precision, numero_de_intentos):
    numero_de_agujas = 1000
    sigma = precision

    while sigma >= precision/1.96:  # intervalo de confianza
        media, sigma = estimacion(numero_de_agujas, numero_de_intentos)
        numero_de_agujas *= 2

    return media


if __name__ == '__main__':
    estimar_pi(0.01, 1000)

좋은 웹페이지 즐겨찾기