{"id":7086,"date":"2020-03-11T20:53:43","date_gmt":"2020-03-11T19:53:43","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=7086"},"modified":"2020-03-17T07:52:23","modified_gmt":"2020-03-17T06:52:23","slug":"calculo-del-numero-pi-mediante-el-metodo-de-montecarlo","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/calculo-del-numero-pi-mediante-el-metodo-de-montecarlo\/","title":{"rendered":"I1M2019: C\u00e1lculo del n\u00famero pi mediante el m\u00e9todo de Montecarlo"},"content":{"rendered":"<p>En la segunda parte de la clase de hoy del curso de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-19\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se han comentado las soluciones de ejercicios de la relaci\u00f3n 22 sobre el c\u00e1lculo del n\u00famero pi mediante el m\u00e9todo de Montecarlo.<\/p>\n<p>Los ejercicios y sus soluciones se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\n-- ---------------------------------------------------------------------\n-- \u00a7 Introducci\u00f3n                                                     --\n-- ---------------------------------------------------------------------\n\n-- El objetivo de esta relaci\u00f3n de ejercicios es el uso de los n\u00fameros\n-- aleatorios para calcular el n\u00famero pi mediante el m\u00e9todo de\n-- Montecarlo. Un ejemplo del m\u00e9todo se puede leer en el art\u00edculo de\n-- Pablo Rodr\u00edguez \"Calculando pi con gotas de lluvia\" que se encuentra\n-- en http:\/\/bit.ly\/1cNfSR0 \n\n-- ---------------------------------------------------------------------\n-- \u00a7 Librer\u00edas auxiliares                                             --\n-- ---------------------------------------------------------------------\n\nimport System.Random\nimport Graphics.Gnuplot.Simple\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 1. Definir la funci\u00f3n\n--    puntosDelCuadrado :: Int -> IO [(Double,Double)]\n-- tal que (puntosDelCuadrado n) es una lista aleatoria de n puntos del\n-- cuadrado de v\u00e9rtices opuestos (-1,-1) y (1,1). Por ejemplo,\n--    \u03bb> puntosDelCuadrado 2\n--    [(0.7071212580055017,0.5333728820632873),\n--     (-0.18430740317151528,-0.9996319726105287)]\n--    \u03bb> puntosDelCuadrado 2\n--    [(-0.45032646341358595,0.30614607738929633),\n--     (0.4402992058238284,0.5810531167431172)]\n-- ---------------------------------------------------------------------\n\npuntosDelCuadrado :: Int -> IO [(Double,Double)]\npuntosDelCuadrado n = do\n  gen <- newStdGen\n  let xs = randomRs (-1,1) gen\n      (as, ys) = splitAt n xs\n      (bs, _)  = splitAt n ys\n  return (zip as bs)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2. Definir la funci\u00f3n\n--    puntosEnElCirculo :: [(Double,Double)] -> Int\n-- tal que (puntosEnElCirculo xs) es el n\u00famero de puntos de la lista xs\n-- que est\u00e1n en el c\u00edrculo de centro (0,0) y radio 1.\n--    puntosEnElCirculo [(1,0), (0.5,0.9), (0.2,-0.3)]  ==  2\n-- ---------------------------------------------------------------------\n\npuntosEnElCirculo :: [(Double,Double)] -> Int\npuntosEnElCirculo xs =\n  length [(x,y) | (x,y) <- xs\n                , x^2+y^2 <= 1]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 3. Definir la funci\u00f3n\n--    calculoDePi :: Int -> Double\n-- tal que (calculoDePi n) es el c\u00e1lculo del n\u00famero pi usando n puntos\n-- aleatorios (la probabilidad de que est\u00e9n en el c\u00edrculo es pi\/4). Por\n-- ejemplo, \n--    \u03bb> calculoDePi 1000\n--    3.088\n--    \u03bb> calculoDePi 1000\n--    3.184\n--    \u03bb> calculoDePi 10000\n--    3.1356\n--    \u03bb> calculoDePi 100000\n--    3.13348\n-- ---------------------------------------------------------------------\n\ncalculoDePi :: Int -> IO Double\ncalculoDePi n = do\n  xs <- puntosDelCuadrado n\n  let enCirculo = fromIntegral (puntosEnElCirculo xs)\n      total     = fromIntegral n\n  return (4 * enCirculo \/ total)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 4. Definir la funci\u00f3n\n--    graficaPi :: [Int] -> IO ()\n-- tal que (graficaPi xs) dibuja la grafica del valor de pi usando el\n-- n\u00famero de puntos indicados por los elementos de xs.\n-- -----------------------------------------------------------------------\n\ngraficaPi :: [Int] -> IO ()\ngraficaPi xs = do\n  ys <- mapM calculoDePi xs\n  plotLists [Key Nothing]\n            [ zip xs ys\n            , zip xs (repeat pi) ]\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la segunda parte de la clase de hoy del curso de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se han comentado las soluciones de ejercicios de la relaci\u00f3n 22 sobre el c\u00e1lculo del n\u00famero pi mediante el m\u00e9todo de Montecarlo. Los ejercicios y sus soluciones se muestran a continuaci\u00f3n<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[331],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7086"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=7086"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7086\/revisions"}],"predecessor-version":[{"id":7091,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7086\/revisions\/7091"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=7086"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=7086"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=7086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}