{"id":3756,"date":"2013-10-15T22:16:00","date_gmt":"2013-10-15T20:16:00","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3756"},"modified":"2013-10-15T22:16:00","modified_gmt":"2013-10-15T20:16:00","slug":"i1m2013-ejercicios-de-definiciones-por-comprension-2-y-graficos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2013-ejercicios-de-definiciones-por-comprension-2-y-graficos\/","title":{"rendered":"I1M2013: Ejercicios de definiciones por comprensi\u00f3n (2) y gr\u00e1ficos"},"content":{"rendered":"<p>En la clase de hoy del curso <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-13\">Inform\u00e1tica (de 1\u00ba de Grado en Matem\u00e1ticas)<\/a> se han comentado las soluciones de los ejercicios 8 a 14 de la 4\u00aa relaci\u00f3n sobre definiciones por comprensi\u00f3n. Adem\u00e1s, se ha introducido la representaci\u00f3n de gr\u00e1ficas con gnuplot.<\/p>\n<p>Los ejercicios y sus soluciones se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.1. Definir la funci\u00f3n aproxE tal que (aproXE n) es la\r\n-- lista cuyos elementos son los t\u00e9rminos de la sucesi\u00f3n (1+1\/m)**m\r\n-- desde 1 hasta n. Por ejemplo, \r\n--    aproxE 1 == [2.0]\r\n--    aproxE 4 == [2.0,2.25,2.37037037037037,2.44140625]\r\n-- ---------------------------------------------------------------------\r\n\r\naproxE n = [(1+1\/m)**m | m <- [1..n]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.2. \u00bfCu\u00e1l es el l\u00edmite de la sucesi\u00f3n (1+1\/m)**m ?\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El l\u00edmite de la sucesi\u00f3n es el n\u00famero e. \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.3. Definir la funci\u00f3n errorE tal que (errorE x) es el\r\n-- menor n\u00famero de t\u00e9rminos de la sucesi\u00f3n (1+1\/m)**m necesarios para\r\n-- obtener su l\u00edmite con un error menor que x. Por ejemplo,\r\n--    errorAproxE 0.1    ==  13.0\r\n--    errorAproxE 0.01   ==  135.0\r\n--    errorAproxE 0.001  ==  1359.0\r\n-- Indicaci\u00f3n: En Haskell, e se calcula como (exp 1).\r\n-- ---------------------------------------------------------------------\r\n\r\nerrorAproxE x = head [m | m <- [1..], abs((exp 1) - (1+1\/m)**m) < x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9.1. Definir la funci\u00f3n aproxLimSeno tal que \r\n-- (aproxLimSeno n) es la lista cuyos elementos son los t\u00e9rminos de la\r\n-- sucesi\u00f3n  \r\n--    sen(1\/m) \r\n--    --------\r\n--      1\/m \r\n-- desde 1 hasta n. Por ejemplo,\r\n--    aproxLimSeno 1 == [0.8414709848078965]\r\n--    aproxLimSeno 2 == [0.8414709848078965,0.958851077208406]\r\n-- ---------------------------------------------------------------------\r\n\r\naproxLimSeno n = [sin(1\/m)\/(1\/m) | m <- [1..n]] \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9.2. \u00bfCu\u00e1l es el l\u00edmite de la sucesi\u00f3n sen(1\/m)\/(1\/m) ?\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El l\u00edmite es 1.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9.3. Definir la funci\u00f3n errorLimSeno tal que \r\n-- (errorLimSeno x) es el menor n\u00famero de t\u00e9rminos de la sucesi\u00f3n \r\n-- sen(1\/m)\/(1\/m) necesarios para obtener su l\u00edmite con un error menor\r\n-- que x. Por ejemplo, \r\n--    errorLimSeno 0.1     ==   2.0\r\n--    errorLimSeno 0.01    ==   5.0\r\n--    errorLimSeno 0.001   ==  13.0\r\n--    errorLimSeno 0.0001  ==  41.0\r\n-- ---------------------------------------------------------------------\r\n\r\nerrorLimSeno x = head [m | m <- [1..], abs(1 - sin(1\/m)\/(1\/m)) < x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10.1. Definir la funci\u00f3n calculaPi tal que (calculaPi n) es\r\n-- la aproximaci\u00f3n del n\u00famero pi calculada mediante la expresi\u00f3n\r\n--    4*(1 - 1\/3 + 1\/5 - 1\/7 + ...+ (-1)**n\/(2*n+1))\r\n-- Por ejemplo,\r\n--    calculaPi 3    ==  2.8952380952380956\r\n--    calculaPi 300  ==  3.1449149035588526\r\n-- ---------------------------------------------------------------------\r\n\r\ncalculaPi n = 4 * sum [(-1)**x\/(2*x+1) | x <- [0..n]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10.2. Definir la funci\u00f3n errorPi tal que \r\n-- (errorPi x) es el menor n\u00famero de t\u00e9rminos de la serie\r\n--    4*(1 - 1\/3 + 1\/5 - 1\/7 + ...+ (-1)**n\/(2*n+1))\r\n-- necesarios para obtener pi con un error menor que x. Por ejemplo,\r\n--    errorPi 0.1    ==   9.0\r\n--    errorPi 0.01   ==  99.0\r\n--    errorPi 0.001  ==  999.0\r\n-- ---------------------------------------------------------------------\r\n\r\nerrorPi x = head [n | n <- [1..], abs (pi - (calculaPi n)) < x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 11. Definir la funci\u00f3n ocurrenciasDelMaximo tal que\r\n-- (ocurrenciasDelMaximo xs) es el par formado por el mayor de los\r\n-- n\u00fameros de xs y el n\u00famero de veces que este aparece en la lista\r\n-- xs, si la lista es no vac\u00eda y es (0,0) si xs es la lista vac\u00eda. Por\r\n-- ejemplo,  \r\n--    ocurrenciasDelMaximo [1,3,2,4,2,5,3,6,3,2,1,8,7,6,5]  ==  (8,1)\r\n--    ocurrenciasDelMaximo [1,8,2,4,8,5,3,6,3,2,1,8]        ==  (8,3)\r\n--    ocurrenciasDelMaximo [8,8,2,4,8,5,3,6,3,2,1,8]        ==  (8,4)\r\n-- ---------------------------------------------------------------------\r\n\r\nocurrenciasDelMaximo [] = (0,0)\r\nocurrenciasDelMaximo xs = (maximum xs, sum [1 | y <- xs, y == maximum xs])\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 12. Definir, por comprensi\u00f3n, la funci\u00f3n tienenS tal que\r\n-- (tienenS xss) es la lista de las longitudes de las cadenas de xss que\r\n-- contienen el caracter 's' en may\u00fasculas o min\u00fasculas. Por ejemplo, \r\n--    tienenS [\"Este\",\"es\",\"un\",\"examen\",\"de\",\"hoy\",\"Suerte\"]  ==  [4,2,6]\r\n--    tienenS [\"Este\"]                                         ==  [4]\r\n--    tienenS []                                               ==  []\r\n--    tienenS [\" \"]                                            ==  []\r\n-- ---------------------------------------------------------------------\r\n\r\ntienenS xss = [length xs | xs <- xss, (elem 's' xs) || (elem 'S' xs)]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 13. Decimos que una lista est\u00e1 algo ordenada si para todo\r\n-- par de elementos consecutivos se cumple que el primero es menor o\r\n-- igual que el doble del segundo. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n-- (algoOrdenada xs) que se verifica si la lista xs est\u00e1 algo ordenada. \r\n-- Por ejemplo, \r\n--    algoOrdenada [1,3,2,5,3,8]  ==  True\r\n--    algoOrdenada [3,1]          ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\nalgoOrdenada xs = and [x <= 2*y | (x,y) <- zip xs (tail xs)]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14.1. Definir, por comprensi\u00f3n, la funci\u00f3n tripletas tal \r\n-- que (tripletas xs) es la listas de tripletas de elementos\r\n-- consecutivos de la lista xs. Por ejemplo,\r\n--    tripletas [8,7,6,5,4] == [[8,7,6],[7,6,5],[6,5,4]]\r\n--    tripletas \"abcd\"      == [\"abc\",\"bcd\"]\r\n--    tripletas [2,4,3]     == [[2,3,4]]\r\n--    tripletas [2,4]       == []\r\n-- ---------------------------------------------------------------------\r\n\r\n-- 1\u00aa definici\u00f3n:\r\ntripletas xs = \r\n    [[a,b,c] | ((a,b),c) <- zip (zip xs (tail xs)) (tail (tail xs))]\r\n\r\n-- 2\u00aa definici\u00f3n:\r\ntripletas2 xs = \r\n    [[xs!!n,xs!!(n+1),xs!!(n+2)] | n <- [0..length xs -3]]\r\n\r\n-- 3\u00aa definici\u00f3n:\r\ntripletas3 xs = [take 3 (drop n xs) | n <- [0..length xs - 3]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14.2. Definir la funci\u00f3n tresConsecutivas tal que\r\n-- (tresConsecutivas x ys) se verifica si x ocurre tres veces seguidas\r\n-- en la lista ys. Por ejemplo,\r\n--    tresConsecutivas 3 [1,4,2,3,3,4,3,5,3,4,6]  ==  False\r\n--    tresConsecutivas 'a' \"abcaaadfg\"            ==  True\r\n-- ---------------------------------------------------------------------\r\n\r\ntresConsecutivas x ys = elem [x,x,x] (tripletas ys)\r\n<\/pre>\n<p>Para la presentaci\u00f3n de las gr\u00e1ficas se han usado los siguientes ejemplos<\/p>\n<pre lang=\"haskell\">\r\nimport Graphics.Gnuplot.Simple\r\n\r\n-- Introducci\u00f3n\r\n-- ============\r\n\r\ndib1 =\r\n    plotList [] puntos\r\n    where puntos :: [(Int,Int)]\r\n          puntos = [(x,x^2) | x <- [-100..100]]\r\n\r\ndib2 =\r\n    plotFunc [] [-100..100] cuadrado\r\n    where cuadrado :: Int -> Int\r\n          cuadrado x = x^2\r\n\r\ndib3 =\r\n    plotFuncs [] [-100..100] [cuadrado, cuadrado2]\r\n    where cuadrado, cuadrado2 :: Int -> Int\r\n          cuadrado x  = x^2\r\n          cuadrado2 x = x^2 + 1000\r\n\r\n-- Aproximaci\u00f3n de E (Ejercicio 8)\r\n-- ===============================\r\n\r\ndibAproxE1 n = \r\n    plotList [] puntos\r\n    where puntos  :: [(Float,Float)]\r\n          puntos = [(m,(1+1\/m)**m) | m <- [1..n]]\r\n\r\ndibAproxE2 n = \r\n    plotFunc [] [1..n] aproxE'\r\n        where aproxE' :: Float -> Float\r\n              aproxE' n = (1+1\/n)**n\r\n\r\ndibAproxE3 n = \r\n    plotFuncs [] [1..n] [aproxE', constE]\r\n        where aproxE', constE :: Float -> Float\r\n              aproxE' n = (1+1\/n)**n\r\n              constE n  = exp 1\r\n\r\n-- L\u00edmite del seno (Ejercicio 9)\r\n-- =============================\r\n\r\ndibAproxLS1 n = \r\n    plotList [] puntos\r\n    where puntos  :: [(Float,Float)]\r\n          puntos = [(m,sin(1\/m)\/(1\/m)) | m <- [1..n]]\r\n\r\ndibAproxLS2 n = \r\n    plotFunc [] [1..n] aproxLS'\r\n        where aproxLS' :: Float -> Float\r\n              aproxLS' m = sin(1\/m)\/(1\/m)\r\n\r\ndibAproxLS3 n = \r\n    plotFuncs [] [1..n] [aproxLS', const1]\r\n        where aproxLS', const1 :: Float -> Float\r\n              aproxLS' m = sin(1\/m)\/(1\/m)\r\n              const1 m   = 1\r\n\r\n-- Aproximaci\u00f3n de pi (ejercicio 10)\r\n-- =================================\r\n\r\ndibAproxPi n = \r\n    plotFuncs [] [1..n] [aproxPi, constPi]\r\n        where aproxPi, constPi :: Float -> Float\r\n              aproxPi m = 4 * sum [(-1)**x\/(2*x+1) | x <- [0..m]]\r\n              constPi m = pi\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy del curso Inform\u00e1tica (de 1\u00ba de Grado en Matem\u00e1ticas) se han comentado las soluciones de los ejercicios 8 a 14 de la 4\u00aa relaci\u00f3n sobre definiciones por comprensi\u00f3n. Adem\u00e1s, se ha introducido la representaci\u00f3n de gr\u00e1ficas con gnuplot. Los ejercicios y sus soluciones se muestran a continuaci\u00f3n<\/p>\n","protected":false},"author":2,"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":[222],"tags":[270,300],"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\/3756"}],"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=3756"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3756\/revisions"}],"predecessor-version":[{"id":3757,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3756\/revisions\/3757"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}