2011-12-20 25 views
6

"Simgesel olarak" çözdüğüm bir soruna ve küçük bir simülasyondan farklı bir çözüm bulmak istiyorum. Şimdi, Mathematica'yı kullanarak doğrudan entegrasyonu nasıl alabileceğimi bilmek isterim.Mathematica'da Entegrasyon

Lütfen r = 1 olan bir disk tarafından temsil edilen bir hedefi düşünün (ortada) (0,0). Dart atmak için bu hedefe ulaşmak için olasılıklarımın simülasyonunu yapmak istiyorum.

Şimdi, bunları atma hiçbir önyargıları var ki ben merkezini mu = 0 vurmak zorundadır ortalama ama benim varyans

1. o hedefe ulaşmak olarak benim dart koordinatı düşünüldüğünde (ya da duvar :-)) aşağıdaki dağılımlarına sahip, 2 Gauss: eşit varyans = 1, 0 merkezlenmiş olan 2 dağılımı ile

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)) 

, benim ortak dağılım haline

iki değişkenli Gauss örneğin,

1/(2 \[Pi]\[Sigma]^2) E^(-((x^2 + y^2)/(2 \[Sigma]^2))) 
Bana önce benim çözüm verdi

yüzden hedef veya polar koordinat sisteminde bir dönüşüm sonrasında x^2 + y^2 olması daha aşağı 1.

bir entegrasyon olasılığını vurmak benim olasılığını bilmek gerekir: .39. Simülasyon kullanarak bunu doğruladı:

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

Ben Mathematica'nın entegrasyon kapasitelerini kullanarak bu sorunu çözmek için daha şık bir yolu vardı hissediyorum, ama eter işi haritaya olmadı.

cevap

6

Bunu yapmanın birkaç yolu vardır. Bu (yukarıdaki örneğe benzer) ampirik olarak bunu yapmak için başka bir yolu yoktur, ancak NIntegrate kullanmaktan daha yavaş bir sürü

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

bunu ilginç Mathematica da '[]' JointDistribution entegre edebildi bulundu. –

4

en basit olarak NIntegrate kullanmak olacaktır

Dahili işlev NProbability da hızlıdır:

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

veya

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

hem {0.031, 0.393469} verir. n standart normaller karelerinin toplamı ChiSquare[n] dağıtılır yana

, sen z=x^2+y^2 ve x ve yNormalDistribution[0,1] dağıtılır daha akıcı ifade NProbability[z < 1, z \[Distributed] ChiSquareDistribution[2]] olsun. Zamanlama yukarıdakiyle aynıdır: {0.031, 0.393469}.

DÜZENLEME: Zamanlamalar 8G belleğe sahip bir Vista 64bit Core2 Duo T9600 2.80GHz makine içindir (MMA 8.0.4). Yoda'nın bu makinedeki çözümü zamanlamada {0.031, 0.393469} var.

DÜZENLEME 2: aşağıdaki gibi ChiSquareDistribution[2] kullanılarak Simülasyon yapılabilir:

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

{0.031, 0.3946} elde edilir.

DÜZENLEME 3: zamanlamaları hakkında daha fazla ayrıntı:

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

için ben {0.047, 0.031, 0.032, 0.031, 0.031, 0.016, 0.031, 0.015, 0.016, 0.031} olsun

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

için {0.047, 0.031, 0.031, 0.031, 0.031, 0.016, 0.016, 0.031, 0.015, 0.016}

olsun.

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

için

Ben {0.047, 0.015, 0.016, 0.016, 0.031, 0.015, 0.016, 0.016, 0.015, 0.} olsun. Ben {0.031, 0.032, 0.015, 0., 0.016, 0., 0.015, 0.016, 0.016, 0.} almak Yoda en

[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}] 

için

. ampirik tahmini için

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

Ben {0.031, 0.016, 0.016, 0., 0.015, 0.016, 0.015, 0., 0.016, 0.016} var.

+0

ben kesinlikle çok farklı zamanlamaları – abcd

+0

@yoda olsun ... senin zamanlamaları da çözümler _and_ madeninin üçü için de aynı _exactly_ olduğunu çok şüpheli buluyorum, meraklı değil mi? Yukarıdaki kodu makinenizde çalıştırabilir miyim diye sormak üzereydim. – kglr

+0

Bunlar (Listelediğiniz sırayla) Ben üç yöntemden biri için olsun zamanlamaları ve mayın (son): '{0,035673, 0,022273, 0,097494, 0,009067}' – abcd