Python 3.2 Оценка Пи Монте-Карло?

Я только начинаю программировать, и это задание доставляет мне много хлопот. Как мне изменить приведенный ниже код Монте-Карло (используемый для площади под кривой), чтобы он оценивал число пи?

from random import uniform
from math import exp

def estimate_area(f, a, b, m, n=1000):
    hits = 0
    total = m * (b - a)
    for i in range(n):
        x = uniform(a, b)
        y = uniform(0, m)
        if y <= f(x):
            hits += 1
    frac = hits / n
    return frac * total

def f(x):
    return exp(-x**2)

def main():
    print(estimate_area(f, 0, 2, 1))

main()

Любая помощь будет принята с благодарностью. Спасибо.


person Calvin Merseal    schedule 17.12.2012    source источник


Ответы (2)


Я не решу это за вас, но дам вам подсказку. Подумайте о встраивании единичного круга в квадрат 2x2 и о том, как это может помочь вам оценить π . Как только вы это выясните, используйте внутреннюю симметрию для работы только с одним из четырех квадрантов.

person NPE    schedule 17.12.2012
comment
Спасибо. Я все еще полностью потерялся. Это единственное задание, которое мне не удалось выполнить, в основном потому, что я не знаю, как поместить фигуры в код. Не могли бы вы подсказать, какую часть кода для области под кривой (см. Выше) мне нужно изменить? - person Calvin Merseal; 17.12.2012
comment
@CalvinMerseal: Вам нужно выяснить две вещи: (1) как должен выглядеть f; (2) соответствующие значения a, b и m. Я предлагаю вам нарисовать картину того, что вы пытаетесь сделать, и взять ее оттуда. - person NPE; 17.12.2012
comment
Я совершенно не понимаю, что делаю. Я все еще полностью потерян. Спасибо за вашу помощь, но я не думаю, что смогу понять это. - person Calvin Merseal; 17.12.2012
comment
Я тоже не буду решать эту проблему за вас, но я попытаюсь задать наводящие вопросы: знаете ли вы, что делает оператор def f (x) на интуитивном уровне? Можете ли вы набросать себе на листе бумаги, что он делает? - person Novak; 24.12.2012

Это типичный пример методов Монте-Карло, см., Например, страницу Википедии о методе Монте-Карло. Подумайте об этой проблеме только в одном квадранте, поэтому четверть круга с центром 0,0 и радиусом 1 и квадратом от (0,0) до (1,1). Если вы случайным образом поместите точку в квадрат в точках x=uniform(0,1) и y=uniform(0,1), вы можете проверить, попадает ли точка в четверть круга, (x^2.+y^2.)^0.5 <= 1.0. Вероятность того, что это произойдет, связана с соотношением объемов двух объектов.

person bungernut    schedule 05.12.2014