2011-12-20 9 views
6

私は "象徴的に"解決した問題と少しのシミュレーションを通して、別の解決策を得たいと思います。今、Mathematicaを使って直接どのように統合できたかを知りたい。Mathematicaでの統合

r = 1、(0,0)を中心とするディスクで表されるターゲットを考えてみてください。このターゲットをダーツ投げに当てる確率をシミュレーションしたいと思います。

さて、私はそれらを投げ何の偏見を持っていない、それは私がセンターにヒットするものと平均的にムー= 0であるが、私の分散は、それがターゲット(または壁にぶつかると、私のダーツの座標を考慮すると1

です:-))私は、次の分布、2つのガウス分布を有する:

1/(2 \[Pi]\[Sigma]^2) E^(-((x^2 + y^2)/(2 \[Sigma]^2))) 

XDistribution : 1/Sqrt[2 \[Pi]\[Sigma]^2] E^(-x^2/(2 \[Sigma]^2)) 

YDistribution : 1/Sqrt[2 \[Pi]\[Sigma]^2] E^(-y^2/(2 \[Sigma]^2)) 

= 1に等しい分散と0を中心とそれら2分布を有するが、私の同時分布は、次のような変量ガウスなります

ターゲットに当たったり、x^2 + y^2の確率が1に劣る確率を知る必要があります。

極座標系での変換後の統合は私に最初の解決策をもたらしました: .39。シミュレーションは、使用してそれを確認:

[email protected][ 
    If[ 
     EuclideanDistance[{ 
         RandomVariate[NormalDistribution[0, Sqrt[1]]], 
         RandomVariate[NormalDistribution[0, Sqrt[1]]] 
         }, {0, 0}] < 1, 1,0], {1000000}]/1000000 

私はMathematicaの統合の能力を使用してこの問題を解決するために、よりエレガントな方法があったと感じますが、エーテル仕事をマッピングするためにやったことがなかったです。

答えて

6

実際にこれを行う方法はいくつかあります。

最も単純なようNIntegrateを使用することです:これは(上記のあなたの例と同様に)、経験的にそれを行うための別の方法ですが、NIntegrateを使用してより多く遅く

JointDistrbution = 1/(2 \[Pi] \[Sigma]^2) E^(-((x^2 + y^2)/(2 \[Sigma]^2))); 
NIntegrate[JointDistrbution /. \[Sigma] -> 1, {y, -1, 1}, 
    {x, -Sqrt[1 - y^2], Sqrt[1 - y^2]}] // Timing 

Out[1]= {0.009625, 0.393469} 

(EuclideanDistance[#, {0, 0}] <= 1 & /@ # // Boole // Total)/ 
    [email protected]# &@RandomVariate[NormalDistribution[0, 1], {10^6, 2}] // 
    N // Timing 

Out[2]= {5.03216, 0.39281} 
+0

MathematicaもJointDistributionをIntegrate []することができたのは興味深いことが分かりました。 –

4
内蔵機能 NProbability

も速いです:

NProbability[ x^2 + y^2 <= 1, {x, y} \[Distributed] 
BinormalDistribution[{0, 0}, {1, 1}, 0]] // Timing 

または

NProbability[x^2 + y^2 <= 1, x \[Distributed] 
NormalDistribution[0, 1] && y \[Distributed] 
NormalDistribution[0, 1] ] // Timing 

両方が{0.031, 0.393469}を与えます。

n標準法線の二乗和がChiSquare[n]を配布されているので、あなたはz=x^2+y^2xyNormalDistribution[0,1]配布され、より合理化された表現NProbability[z < 1, z \[Distributed] ChiSquareDistribution[2]]を取得します。タイミングは上記と同じです:{0.031, 0.393469}

編集:8Gメモリ(MMA 8.0.4)を搭載したVista 64ビットCore2 Duo T9600 2.80GHzマシンのタイミングです。このマシンのYodaのソリューションは、タイミング{0.031, 0.393469}を持っています。

EDIT 2:次のようにChiSquareDistribution[2]を使用してシミュレーションを行うことができます。

(data = RandomVariate[ChiSquareDistribution[2], 10^5]; 
    Probability[w <= 1, w \[Distributed] data] // N) // Timing 

{0.031, 0.3946}を生み出します。

EDIT 3:タイミングに関する詳細:

[email protected]@Table[[email protected] 
    NProbability[x^2 + y^2 <= 1, {x, y} \[Distributed] 
    BinormalDistribution[{0, 0}, {1, 1}, 0]], {10}] 

のために私は{0.047, 0.031, 0.032, 0.031, 0.031, 0.016, 0.031, 0.015, 0.016, 0.031}を得る

[email protected]@Table[[email protected] 
NProbability[x^2 + y^2 <= 1, 
x \[Distributed] NormalDistribution[0, 1] && 
    y \[Distributed] NormalDistribution[0, 1] ], {10}] 

については{0.047, 0.031, 0.031, 0.031, 0.031, 0.016, 0.016, 0.031, 0.015, 0.016}

を取得します。

私は {0.047, 0.015, 0.016, 0.016, 0.031, 0.015, 0.016, 0.016, 0.015, 0.}を得る

[email protected]@Table[[email protected] 
NProbability[z < 1, 
z \[Distributed] ChiSquareDistribution[2]], {10}] 

については

。私は{0.031, 0.032, 0.015, 0., 0.016, 0., 0.015, 0.016, 0.016, 0.}を得るヨーダの

[email protected]@Table[[email protected](JointDistrbution = 
    1/(2 \[Pi] \[Sigma]^2) E^(-((x^2 + y^2)/(2 \[Sigma]^2))); 
NIntegrate[ 
    JointDistrbution /. \[Sigma] -> 1, {y, -1, 
    1}, {x, -Sqrt[1 - y^2], Sqrt[1 - y^2]}]), {10}] 

については

。私は{0.031, 0.016, 0.016, 0., 0.015, 0.016, 0.015, 0., 0.016, 0.016}を得た経験的推定

[email protected]@Table[[email protected](Probability[w <= 1, 
w \[Distributed] data] // N), {10}] 

については

+0

私はあなたのタイミングがあなたの解決策の3つすべてについて正確に同じであることを非常に疑わしいと思っています...私は確かに非常に異なるタイミングを得ます – abcd

+0

@yoda、興味がありますか?あなたのマシンで上記のコードを実行できるかどうか聞いていました。 – kglr

+0

これは、3つの方法(リストに記載されている順序)と私(最後):{0.035673,0.022273,0.097494,0.009067} – abcd