From 4a5425d5de1b7db049abd68760bea9ea4352d031 Mon Sep 17 00:00:00 2001 From: Trashtalk Date: Sun, 14 Oct 2018 20:15:33 +0200 Subject: [PATCH 1/4] First working version of monte carlo integration in lisp --- .../code/lisp/monte-carlo.lisp | 15 +++++++++++++++ .../monte_carlo_integration.md | 4 ++++ 2 files changed, 19 insertions(+) create mode 100644 contents/monte_carlo_integration/code/lisp/monte-carlo.lisp diff --git a/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp b/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp new file mode 100644 index 000000000..ec8c0ddbe --- /dev/null +++ b/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp @@ -0,0 +1,15 @@ +;;;; Monte carlo integration to approximate pi + +(defun in-circle-p (x y) + "Checks if a point is in a unit circle" + (< (+ (* x x) (* y y)) 1)) + +(defun monte-carlo (samples) + (loop repeat samples + with count = 0 + do + (when (in-circle-p (random 1.0) (random 1.0)) + (incf count)) + finally (return (* (/ count samples) 4.0)))) + +(print (monte-carlo 1000000)) diff --git a/contents/monte_carlo_integration/monte_carlo_integration.md b/contents/monte_carlo_integration/monte_carlo_integration.md index 18a5d241f..9001868f2 100644 --- a/contents/monte_carlo_integration/monte_carlo_integration.md +++ b/contents/monte_carlo_integration/monte_carlo_integration.md @@ -81,6 +81,8 @@ each point is tested to see whether it's in the circle or not: [import:2-4, lang:"lisp"](code/racket/monte_carlo.rkt) {% sample lang="scala" %} [import:3-3, lang:"scala"](code/scala/monte_carlo.scala) +{% sample lang="lisp" %} +[import:3-5, lang:"lisp"](code/scala/monte-carlo.lisp) {% endmethod %} If it's in the circle, we increase an internal count by one, and in the end, @@ -161,6 +163,8 @@ Feel free to submit your version via pull request, and thanks for reading! [import, lang:"lisp"](code/racket/monte_carlo.rkt) {% sample lang="scala" %} [import, lang:"scala"](code/scala/monte_carlo.scala) +{% sample lang="lisp" %} +[import, lang:"lisp"](code/scala/monte-carlo.lisp) {% endmethod %} From c4ac83c18ebaf241165aefe13ef763320c96d714 Mon Sep 17 00:00:00 2001 From: Trashtalk Date: Sun, 14 Oct 2018 20:25:23 +0200 Subject: [PATCH 2/4] Forgot to add docstring --- contents/monte_carlo_integration/code/lisp/monte-carlo.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp b/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp index ec8c0ddbe..2e4f92a54 100644 --- a/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp +++ b/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp @@ -5,6 +5,7 @@ (< (+ (* x x) (* y y)) 1)) (defun monte-carlo (samples) + "Returns an approximation of pi" (loop repeat samples with count = 0 do From 97f52badcc5ac74105413954a81de2a7d78358b1 Mon Sep 17 00:00:00 2001 From: Trashtalk Date: Mon, 15 Oct 2018 18:33:28 +0200 Subject: [PATCH 3/4] Added error output. --- contents/monte_carlo_integration/code/lisp/monte-carlo.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp b/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp index 2e4f92a54..ce4f13ddb 100644 --- a/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp +++ b/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp @@ -13,4 +13,6 @@ (incf count)) finally (return (* (/ count samples) 4.0)))) -(print (monte-carlo 1000000)) +(defvar pi-estimate (monte-carlo 5000000)) +(format t "Estimate: ~D ~%" pi-estimate) +(format t "Error: ~D" (* (/ (- pi-estimate pi) pi) 100)) From ee7f354ce2918ace7c35539e66eb0f9c82ca06a8 Mon Sep 17 00:00:00 2001 From: Jie Date: Wed, 17 Oct 2018 18:09:13 +0200 Subject: [PATCH 4/4] Updated the output --- contents/monte_carlo_integration/code/lisp/monte-carlo.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp b/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp index ce4f13ddb..f1b90052e 100644 --- a/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp +++ b/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp @@ -15,4 +15,4 @@ (defvar pi-estimate (monte-carlo 5000000)) (format t "Estimate: ~D ~%" pi-estimate) -(format t "Error: ~D" (* (/ (- pi-estimate pi) pi) 100)) +(format t "Error: ~D%" (* (/ (abs (- pi-estimate pi)) pi) 100))