{"id":4721,"date":"2019-02-13T06:00:00","date_gmt":"2019-02-13T04:00:00","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4721"},"modified":"2022-03-25T20:07:20","modified_gmt":"2022-03-25T18:07:20","slug":"calculo-de-pi-mediante-la-serie-de-nilakantha","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/calculo-de-pi-mediante-la-serie-de-nilakantha\/","title":{"rendered":"C\u00e1lculo de pi mediante la serie de Nilakantha"},"content":{"rendered":"<p>Una serie infinita para el c\u00e1lculo de pi, publicada por <a href=\"http:\/\/bit.ly\/2l84M1J\">Nilakantha<\/a> en el siglo XV, es<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2017\/02\/Calculo_de_pi_mediante_la_serie_de_Nilakantha.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2017\/02\/Calculo_de_pi_mediante_la_serie_de_Nilakantha.png?resize=571%2C83\" alt=\"\" width=\"571\" height=\"83\" class=\"aligncenter size-full wp-image-3028\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2017\/02\/Calculo_de_pi_mediante_la_serie_de_Nilakantha.png?w=571&amp;ssl=1 571w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2017\/02\/Calculo_de_pi_mediante_la_serie_de_Nilakantha.png?resize=300%2C43&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2017\/02\/Calculo_de_pi_mediante_la_serie_de_Nilakantha.png?resize=100%2C14&amp;ssl=1 100w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2017\/02\/Calculo_de_pi_mediante_la_serie_de_Nilakantha.png?resize=150%2C21&amp;ssl=1 150w\" sizes=\"(max-width: 571px) 100vw, 571px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   aproximacionPi :: Int -> Double\n   tabla          :: FilePath -> [Int] -> IO ()\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(aproximacionPi n) es la n-\u00e9sima aproximaci\u00f3n de pi obtenido sumando los n primeros t\u00e9rminos de la serie de Nilakantha. Por ejemplo, <\/li>\n<\/ul>\n<pre lang=\"text\">\n     aproximacionPi 0        ==  3.0\n     aproximacionPi 1        ==  3.1666666666666665\n     aproximacionPi 2        ==  3.1333333333333333\n     aproximacionPi 3        ==  3.145238095238095\n     aproximacionPi 4        ==  3.1396825396825396\n     aproximacionPi 5        ==  3.1427128427128426\n     aproximacionPi 10       ==  3.1414067184965018\n     aproximacionPi 100      ==  3.1415924109719824\n     aproximacionPi 1000     ==  3.141592653340544\n     aproximacionPi 10000    ==  3.141592653589538\n     aproximacionPi 100000   ==  3.1415926535897865\n     aproximacionPi 1000000  ==  3.141592653589787\n     pi                      ==  3.141592653589793\n<\/pre>\n<ul>\n<li>(tabla f ns) escribe en el fichero f las n-\u00e9simas aproximaciones de pi, donde n toma los valores de la lista ns, junto con sus errores. Por ejemplo, al evaluar la expresi\u00f3n<\/li>\n<\/ul>\n<pre lang=\"text\">\n     tabla \"AproximacionesPi.txt\" [0,10..100]\n<\/pre>\n<p>hace que el contenido del fichero \u00abAproximacionesPi.txt\u00bb sea<\/p>\n<pre lang=\"text\">\n+------+----------------+----------------+\n| n    | Aproximaci\u00f3n   | Error          |\n+------+----------------+----------------+\n|    0 | 3.000000000000 | 0.141592653590 |\n|   10 | 3.141406718497 | 0.000185935093 |\n|   20 | 3.141565734659 | 0.000026918931 |\n|   30 | 3.141584272675 | 0.000008380915 |\n|   40 | 3.141589028941 | 0.000003624649 |\n|   50 | 3.141590769850 | 0.000001883740 |\n|   60 | 3.141591552546 | 0.000001101044 |\n|   70 | 3.141591955265 | 0.000000698325 |\n|   80 | 3.141592183260 | 0.000000470330 |\n|   90 | 3.141592321886 | 0.000000331704 |\n|  100 | 3.141592410972 | 0.000000242618 |\n+------+----------------+----------------+\n<\/pre>\n<p>al evaluar la expresi\u00f3n<\/p>\n<pre lang=\"text\">\n     tabla \"AproximacionesPi.txt\" [0,500..5000]\n<\/pre>\n<p>hace que el contenido del fichero \u00abAproximacionesPi.txt\u00bb sea<\/p>\n<pre lang=\"text\">\n+------+----------------+----------------+\n| n    | Aproximaci\u00f3n   | Error          |\n+------+----------------+----------------+\n|    0 | 3.000000000000 | 0.141592653590 |\n|  500 | 3.141592651602 | 0.000000001988 |\n| 1000 | 3.141592653341 | 0.000000000249 |\n| 1500 | 3.141592653516 | 0.000000000074 |\n| 2000 | 3.141592653559 | 0.000000000031 |\n| 2500 | 3.141592653574 | 0.000000000016 |\n| 3000 | 3.141592653581 | 0.000000000009 |\n| 3500 | 3.141592653584 | 0.000000000006 |\n| 4000 | 3.141592653586 | 0.000000000004 |\n| 4500 | 3.141592653587 | 0.000000000003 |\n| 5000 | 3.141592653588 | 0.000000000002 |\n+------+----------------+----------------+\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Text.Printf\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\naproximacionPi :: Int -> Double\naproximacionPi n = serieNilakantha !! n\n\nserieNilakantha :: [Double]\nserieNilakantha = scanl1 (+) terminosNilakantha\n\nterminosNilakantha :: [Double]\nterminosNilakantha = zipWith (\/) numeradores denominadores\n  where numeradores   = 3 : cycle [4,-4]\n        denominadores = 1 : [n*(n+1)*(n+2) | n <- [2,4..]]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\naproximacionPi2 :: Int -> Double\naproximacionPi2 = aux 3 2 1\n  where aux x _ _ 0 = x\n        aux x y z m =\n          aux (x+4\/product[y..y+2]*z) (y+2) (negate z) (m-1)\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\naproximacionPi3 :: Int -> Double\naproximacionPi3 x =\n  3 + sum [(((-1)**(n+1))*4)\/(2*n*(2*n+1)*(2*n+2))\n          | n <- [1..fromIntegral x]]\n\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> aproximacionPi (10^6)\n--    3.141592653589787\n--    (1.35 secs, 729,373,160 bytes)\n--    \u03bb> aproximacionPi2 (10^6)\n--    3.141592653589787\n--    (2.96 secs, 2,161,766,096 bytes)\n--    \u03bb> aproximacionPi3 (10^6)\n--    3.1415926535897913\n--    (2.02 secs, 1,121,372,536 bytes)\n\n-- Definicio\u0144 de tabla\n-- ===================\n\ntabla :: FilePath -> [Int] -> IO ()\ntabla f ns = writeFile f (tablaAux ns)\n\ntablaAux :: [Int] -> String\ntablaAux ns =\n     linea\n  ++ cabecera\n  ++ linea\n  ++ concat [printf \"| %4d | %.12f | %.12f |\\n\" n a e\n            | n <- ns\n            , let a = aproximacionPi n\n            , let e = abs (pi - a)]\n  ++ linea\n\nlinea :: String\nlinea = \"+------+----------------+----------------+\\n\"\n\ncabecera :: String\ncabecera = \"| n    | Aproximaci\u00f3n   | Error          |\\n\"\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nBueno es saber que los vasos<br \/>\nnos sirven para beber;<br \/>\nlo malo es que no sabemos<br \/>\npara que sirve la sed.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Una serie infinita para el c\u00e1lculo de pi, publicada por Nilakantha en el siglo XV, es Definir las funciones aproximacionPi :: Int -> Double tabla :: FilePath -> [Int] -> IO () tales que (aproximacionPi n) es la n-\u00e9sima aproximaci\u00f3n de pi obtenido sumando los n primeros t\u00e9rminos de la serie de Nilakantha. Por ejemplo,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","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":[4],"tags":[130,12,166,415,11,381,252,380,76],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4721"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=4721"}],"version-history":[{"count":5,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4721\/revisions"}],"predecessor-version":[{"id":4746,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4721\/revisions\/4746"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}