2009-06-11 9 views
4

モンテカルロを使用してπを見つけるための多くのアルゴリズムを試しました。モンテカルロを使用してPI数字を見つける

def calc_PI(): 
    n_points = 1000000 
    hits = 0 

    for i in range(1, n_points): 
     x, y = uniform(0.0, 1.0), uniform(0.0, 1.0) 

     if (x**2 + y**2) <= 1.0: 
      hits += 1 

    print "Calc2: PI result", 4.0 * float(hits)/n_points 

悲しい部分は(3.141 ...)でも1000000000の精度が非常に悪いということである: は(Pythonで)解決策の一つがこれです。

これは、このメソッドが提供できる最大の精度ですか? 私がMonte Carloを選ぶ理由は、並列部品でそれを壊すことは非常に簡単だということでした。 ピースに分割して計算しやすいπのアルゴリズムがありますか?

答えて

14

これはMonte Carloの典型的な例です。しかし、πの計算を並列部分に分割しようとしている場合は、無限の系列を使用して各コアに範囲を取らせるだけでなく、結果を合計するのはなぜですか?

http://mathworld.wolfram.com/PiFormulas.html

+0

これが私の最初のアプローチでした。しかし、私はモンテカルロで少し演奏していますが、それは多くの分野で使用できるためです。 –

+19

数式を見つけるのが難しい場合は、Monte Carloを使用してください。数式を見つけるのが簡単な場合は、数式を使用します。 – Nosredna

+0

素敵なモットーのためにUpvoted! –

8

あなたの分数誤差はsqrt(N)/N = 1/sqrt(N)となり、正確な見積もりを得るには非常に非効率的です。この限界は測定の統計的性質によって設定され、殴ることはできません。

Nスローでは、精度が約floor(log_10(N))/2-1桁になるはずです。たぶん安全のために-2 ...

実際のRNGまたは十分なPRNGを使用していることを前提にしています。

4

代わり標準擬似RNGの疑似乱数発生器(http://www.nag.co.uk/IndustryArticles/introduction_to_quasi_random_numbers.pdf)を使用。準乱数は、擬似乱数よりも均等に統合領域(あなたがやっていることはMC統合です)をカバーし、より良い収束をもたらします。

+0

私は、この*がより速く収束するのに対し、信頼限界を見積もるのは難しいかもしれないと思います。あなたはその問題に関する文献を知っていますか? – dmckee

+0

いいえ、信頼区間(絶対誤差推定値と推定値が間違っているChi^2確率を返します)を含めてMC統合を実装したCライブラリhttp://www.feynarts.de/cuba/があります。コードをダウンロードして実装を調べるか、コードを書くのに使用した文献を尋ねる著者に電子メールで伝えることができます。 –

+1

ああ!著者はこの問題に関する論文にリンクしています。 Computational Physics Communications(およびarXivのhttp://arxiv.org/abs/hep-ph/0404043)に掲載されています。私にとって悲惨な部分は、彼は私と同じ仕事の行にあり、これが最初であることです、これを聞いたことがあります。 D'oh! – dmckee

関連する問題