モンテカルロ積分を実装するまで
Upcoming SlideShare
Loading in...5
×
 

モンテカルロ積分を実装するまで

on

  • 1,959 views

SICP 問題 3.5

SICP 問題 3.5

Statistics

Views

Total Views
1,959
Slideshare-icon Views on SlideShare
1,450
Embed Views
509

Actions

Likes
0
Downloads
0
Comments
0

1 Embed 509

http://rejasupo.hatenablog.com 509

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    モンテカルロ積分を実装するまで モンテカルロ積分を実装するまで Presentation Transcript

    • モンテカルロ積分を 実装するまで @rejasupotaro
    • モンテカルロ法とは乱数を用いたシミュレーションを何度も行うことにより近似解を求める計算手法、たとえば…ランダムに選んだ2つの整数が共通の因子を持たない(= 最大公約数が1) 確率は6 / (π^2) であるという事実を使ってπの近似値を得ることができる。GCDが1だった回数 / 試行回数 = 6 / (π^2)つまりπの近似値は、π = (6 / 試行が成功した確率) の平方根
    • ;; πの近似値を求める(define (estimate-pi trials) (sqrt (/ 6 (monte-carlo trials cesaro-test))))(define (cesaro-test) (= (gcd (rand) (rand)) 1))(define (monte-carlo trials experiment) (define (iter trials-remaining trials-passed) (cond ((= trials-remaining 0) (/ trials-passed trials)) ((experiment) (iter (- trials-remaining 1) (+ trials-passed 1))) (else (iter (- trials-remaining 1) trials-passed)))) (iter trials 0))
    • ;; πの近似値を求める(define (estimate-pi trials) (sqrt (/ 6 (monte-carlo trials cesaro-test))))(define (cesaro-test) (estimate-pi 試行回数) (= (gcd (rand) (rand)) 1)) で呼び出す(define (monte-carlo trials experiment) (define (iter trials-remaining trials-passed) (cond ((= trials-remaining 0) (/ trials-passed trials)) ((experiment) (iter (- trials-remaining 1) (+ trials-passed 1))) (else (iter (- trials-remaining 1) trials-passed)))) (iter trials 0))
    • ;; πの近似値を求める(define (estimate-pi trials) (sqrt (/ 6 (monte-carlo trials cesaro-test)))) (monte-carlo 試行回数 ~テスト)(define (cesaro-test) (= (gcd (rand) (rand)) 1)) で呼び出す(define (monte-carlo trials experiment) (define (iter trials-remaining trials-passed) (cond ((= trials-remaining 0) (/ trials-passed trials)) ((experiment) (iter (- trials-remaining 1) (+ trials-passed 1))) (else (iter (- trials-remaining 1) trials-passed)))) (iter trials 0))
    • ;; πの近似値を求める cesaro-testを繰り返し呼びながら(define (estimate-pi trials) 試行の成功回数をカウントする (sqrt (/ 6 (monte-carlo trials cesaro-test))))(define (cesaro-test) (= (gcd (rand) (rand)) 1))(define (monte-carlo trials experiment) (define (iter trials-remaining trials-passed) (cond ((= trials-remaining 0) (/ trials-passed trials)) ((experiment) (iter (- trials-remaining 1) (+ trials-passed 1))) (else (iter (- trials-remaining 1) trials-passed)))) (iter trials 0))
    • ;; πの近似値を求める trials-remainingが0になったら(define (estimate-pi trials) 試行が成功した確率を計算して返す (sqrt (/ 6 (monte-carlo trials cesaro-test))))(define (cesaro-test) (= (gcd (rand) (rand)) 1))(define (monte-carlo trials experiment) (define (iter trials-remaining trials-passed) (cond ((= trials-remaining 0) (/ trials-passed trials)) ((experiment) (iter (- trials-remaining 1) (+ trials-passed 1))) (else (iter (- trials-remaining 1) trials-passed)))) (iter trials 0))
    • ;; πの近似値を求める(define (estimate-pi trials) (sqrt (/ 6 (monte-carlo trials cesaro-test))))(define (cesaro-test) 最後にπの近似値を算出する (= (gcd (rand) (rand))(6 / 試行が成功した確率) の平方根 1))(define (monte-carlo trials experiment) (define (iter trials-remaining trials-passed) (cond ((= trials-remaining 0) (/ trials-passed trials)) ((experiment) (iter (- trials-remaining 1) (+ trials-passed 1))) (else (iter (- trials-remaining 1) trials-passed)))) (iter trials 0))
    • 問題 3.5
    • 問題 3.5モンテカルロ積分はモンテカルロ法を使って定積分を見積もる方法である。 ~中略~モンテカルロ積分を、手続きestimate- integralとして実装せよ!最初この問題を見たときこう思った
    • 問題 3.5「モンテカルロ積分を、手続き estimate-integralとして実装せよ!」
    • とりあえずもう一回問題を見てみよう
    • とりあえず、もう一回問題を見てみようなるほど、モンテカルロ法を使って単位円からπをスイテーすればいいのか(?)
    • 円周率の推定 正方形の中に適当に点を打つと、円の中に点が打たれる確率は 円内に打たれた点の数 / 点を打った全数 ↑この一回点を打つのを試行とする また、指定された領域のうち円の面積が占める割合は (正方形の一辺を直径とする円の面積) / (正方形の面積) = ((L / 2) * (L / 2) * π) / (L * L) = (L * L * π / 4) / (L * L) =π/4円内に打たれた点の数 / 点を打った全数 =π/4 L つまり… π = 試行が成功した確率 * 4
    • 手続きestimate-integralのを引数みると(define (estimate-integral p, x1, x2, y1, y2, trials) ; なんらかの処理 )
    • とりあえず、 単位円からπを推定することを考えると 円内に打たれた点の数 / 点を打った全数 =π/4 π = 試行が成功した確率 * 4(define (estimate-integral, trials) (* 4 (monte-carlo trials rejasupo-test)) )
    • monte-calroに引数として渡す“適当に点を打って円の中に点が打たれたか” 調べる手続きを書く (x, y)(define (rejasupo-test) 1 (let ((x (random)) (y (random))) (<= (+ (* x x) (* y y)) 1)))
    • ; 単位円からπを推定する(define (estimate-integral trials) (* (monte-carlo trials rejasupo-test) 4.0))(define (rejasupo-test) (let ((x (random)) (y (random))) (<= (+ (* x x) (* y y)) 1)))(define (monte-carlo trials experiment) (define (iter trials-remaining trials-passed) (cond ((= trials-remaining 0) (/ trials-passed trials)) ((experiment) (iter (- trials-remaining 1) (+ trials-passed 1))) (else (iter (- trials-remaining 1) trials-passed))))
    • ; 単位円からπを推定する(define (estimate-integral trials) (* (monte-carlo trials rejasupo-test) 4.0))(define (rejasupo-test) (let ((x (random)) (y (random))) (<= (+ (* x x) (* y y)) 1)))(define (monte-carlo trials experiment) (define (iter trials-remaining trials-passed) (cond ((= trials-remaining 0) (/ trials-passed trials)) ((experiment) (iter (- trials-remaining 1) (+ trials-passed 1))) (else (iter (- trials-remaining 1) trials-passed))))
    • 実行結果
    • 実は今やったことは 述語P(x, y)が (x – 0)^2 + (y – 0)^2 <= 1のときのテストをしていたのでは(define (rejasupo-test) (let ((x (random)) (y (random))) (<= (+ (* x x) (* y y)) 1))) ↑ここを述語Pとして、引数に与えれば
    • 定積分は面積 円の面積 = 正方形の面積 * 円の面積の割合(define (estimate-integral p x1 x2 y1 y2 trials) (* (* (- x2 x1) (- y2 y1)) ←領域内の面積を計算 (monte-carlo trials (rejasupo-test p x1 x2 y1 y2)))) ↑円の面積の割合を計算
    • (define (estimate-integral p x1 x2 y1 y2 trials) (* 1.0 (* (- x2 x1) (- y2 y1)) (monte-carlo trials (rejasupo-test p x1 x2 y1 y2))))(define (rejasupo-test p x1 x2 y1 y2) (let ((x (random-in-range x1 x2)) (y (random-in-range y1 y2))) (lambda () (p x y))))(define (monte-carlo trials experiment) ~同じなので省略~ (iter trials 0))(define (predicate x y) (define (square n) (* n n)) (<= (+ (square (- x 5)) (square (- y 7))) (square 3)))
    • (define (estimate-integral p x1 x2 y1 y2 trials) (* 1.0 (* (- x2 x1) (- y2 y1)) 試行を返す手続きを定義 (monte-carlo trials (rejasupo-test p x1 x2 y1 y2))))(define (rejasupo-test p x1 x2 y1 y2) (let ((x (random-in-range x1 x2)) (y (random-in-range y1 y2))) (lambda () (p x y))))(define (monte-carlo trials experiment) ~同じなので省略~ (iter trials 0))(define (predicate x y) 述語P(x, y)を定義 (define (square n) (* n n)) (<= (+ (square (- x 5)) (square (- y 7))) (square 3)))
    • うまくいくと思ったが、面積が0あるいは36しか返ってこない… (本当は半径が3の円の面積なので 28ちょいになってほしい)
    • (define (estimate-integral p x1 x2 y1 y2 trials) (* 1.0 (* (- x2 x1) (- y2 y1)) (monte-carlo trials (rejasupo-test p x1 x2 y1 y2))))(define (rejasupo-test p x1 x2 y1 y2) (let ((x (random-in-range x1 x2)) (y (random-in-range y1 y2))) (lambda () (p x y))))(define (monte-carlo trials experiment) ~同じなので省略~ (iter trials 0)) どこがわるいの(define (predicate x y) (define (square n) (* n n)) (<= (+ (square (- x 5)) (square (- y 7))) (square 3)))
    • (define (estimate-integral p x1 x2 y1 y2 trials) (* 1.0 (* (- x2 x1) (- y2 y1)) (monte-carlo trials (rejasupo-test p x1 x2 y1 y2))))(define (rejasupo-test p x1 x2 y1 y2) (let ((x (random-in-range x1 x2)) (y (random-in-range y1 y2))) (lambda () (p x y)))) うっ、(define (monte-carlo trials experiment) ~同じなので省略~ 手続きを返してるけどこれだと (iter trials 0)) 乱数が最初しか計算されないので 試行が常にTかFを返すことに…(define (predicate x y) (define (square n) (* n n)) (<= (+ (square (- x 5)) (square (- y 7))) (square 3)))
    • 手続きを返す手続きを呼ぶのではなく、(define (estimate-integral p x1 x2 y1 y2 trials) (* 1.0 (* (- x2 x1) (- y2 y1)) 直接手続きを渡す (monte-carlo trials (lambda () (rejasupo-test p x1 x2 y1 y2)))))(define (rejasupo-test p x1 x2 y1 y2) (let ((x (random-in-range x1 x2)) (y (random-in-range y1 y2))) (p x y)))(define (monte-carlo trials experiment) ~同じなので省略~ (iter trials 0))(define (predicate x y) (define (square n) (* n n))
    • 実行結果(完)