0

モンテカルロ シミュレーションを使用して pi の値を推定しようとしています。原点からのユーザー入力距離である 2 つの単位円を使用する必要があります。これは私が持っているものです:

import random
import math
import sys

def main():
    numDarts=int(sys.argv[1])
    distance=float(sys.argv[2])
    print(montePi(numDarts,distance))

def montePi(numDarts,distance):
    width=2*(1-distance)
    if distance>=1:
        return(0)
    inCircle=0
    for i in range(numDarts):
        x=(width*(random.random()))-width  
        y=(random.random())
        d=(x-distance)**2+(y-0)**2
        d2=(x-(distance*-1))**2+(y-0)**2
        if d<=1 and d2>=-1:
            inCircle=inCircle+1
    pi=(inCircle/numDarts)*(width*2)
    return pi

main()

これは私が得るべきものです-

距離 = 0 の場合、約 3.14 距離 = .5 の場合、約 1.288 それぞれ約 1.6 と .6 になるのはなぜですか?

これらは私の指示です-

モンテカルロ法を使用してこの形状の面積を推定する (そして結果を出力する) mcintersection.py というプログラムを作成します。プログラムは、distance と numDarts の 2 つのコマンド ライン パラメータを使用する必要があります。距離パラメーターは、円が x 軸の原点からどれだけ離れているかを指定します。したがって、距離が 0 の場合、両方の円は原点を中心とし、完全に重なります。距離が 0.5 の場合、1 つの円は (-0.5, 0) を中心とし、もう 1 つの円は (0.5, 0) を中心とします。距離が 1 以上の場合、円はまったく重なりません! 最後のケースでは、プログラムは単純に 0 を出力できます。numDarts パラメータは、モンテカルロ プロセスで選択するランダム ポイントの数を指定する必要があります。

この場合、長方形の高さは 2 単位である必要があります (上部が y = 1、下部が y = -1)。長方形を安全に 2 単位幅にすることもできますが、これは通常、必要以上に大きくなります。代わりに、距離パラメーターに基づいて、形状の幅を正確に把握する必要があります。そうすれば、できるだけ細い長方形を使用できます。

4

1 に答える 1

4

結果が本来あるべき状態のほぼ半分になっていることに注意してください。

距離 0 のダーツの位置を出力してみると、どこで問題が発生するかが明らかになるはずです。x値はすべて負であり、-2 という低い値になっています。 1 対 1 です。したがって、必要なヒット数の半分しか得られません。そして、問題は他の距離でも同じです。特定するのは少し明白ではありませんが、同様の何かが間違っていることは明らかです.

したがって、それぞれの式を見てくださいx

x=(width*(random.random()))-width

width*(random.random())0 から width までの乱数を与えます。減算widthすると、-width から 0 までの乱数が得られます。

そして今、修正は明らかなはずです:

x=(width*(random.random()))-width/2

一方、d2は常に正になります。これは 2 つの平方の合計であるため、d2>=-1常に真です。あなたはチェックしたかったd2<=1。(dy>=-1 が必要であるという記述から作業している場合は、おそらく、正方形内の式ではなく、正方形を否定する必要がありました。しかし、とにかく同じ効果があります。)

d2距離が 0 の場合、値が正確に 0 と 1 の間にあるため、これは違いはありませんd1。しかし、距離が長くなるにつれて、カウントを 2 次的に過大評価するようになります。


最後に、問題が通常説明される方法 (および具体的に説明された方法) では、円は X 軸上の点を中心としているはずです。しかし、あなたはそうしていません。0.0 から 1.0 までの数字を選択しています。あなたが欲しかっy=random.random()-.5た。

しかし、距離の計算も間違っています。との式でy-0.5はなくy-0、が必要です。dd2

これらの両方を間違えると、事実上、X 軸を 0.5 だけ下にシフトしたことになり、明らかに結果には影響しません。したがって、意図的に行うと、これは有用な最適化/単純化になる可能性があります。または、たまたま相殺される 2 つのバグである可能性もあります。


作業中は、ほとんどの式を単純化して読みやすくすることができます。ステートメントの や代入の(0)のように、単一の値をあちこちに括弧で囲んでいます。明らかに有用な効果はありません。is the same as which is same as (これにより、d と d2 の関係がより明確になります)。等々。return(random.random())y-0x-(distance*-1)x-(-distance)x+distance

于 2013-09-25T00:56:32.310 に答える