Límites de sucesiones y tipos de números en Haskell
En Haskell se dispone de tres tipos para trabajar con los números racionales: dos como números aproximados (Float y Double) y uno como números exactos (Rational). En este ejemplo veremos cómo el uso de números aproximados puede conducir a falsas conjeturas sobre límites de sucesiones que pueden refutarse con el uso de los números exactos. Para ello consideraremos tres definiciones de la sucesión :
usando en cada caso uno de los tipos y conjeturando el límite de la sucesión.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
-- --------------------------------------------------------------------- -- § Librería auxiliar -- -- --------------------------------------------------------------------- import Data.Ratio -- --------------------------------------------------------------------- -- Ejercicio 1. Definir la función -- u :: Int -> Float -- tal que (u n) es el n-ésimo término de la sucesión u. -- --------------------------------------------------------------------- u :: Int -> Float u 0 = 3/2 u 1 = 5/3 u n = 2003 - 6002/(u (n-1)) + 4000/((u (n-1))*(u (n-2))) -- --------------------------------------------------------------------- -- Ejercicio 2. Calcular los 10 primeros términos de la sucesión u y -- conjeturar el límite de la sucesión u. -- --------------------------------------------------------------------- -- El cálculo es -- ghci> [(n, u n) | n <- [0..9]] -- [(0, 1.5), -- (1, 1.6666666), -- (2, 1.7998047), -- (3, 1.6717529), -- (4,-257.8224), -- (5,2016.9991), -- (6,2000.0166), -- (7,2000.0), -- (8,2000.0), -- (9,2000.0)] -- A partir de lo anterior, la conjetura es que el límite de la sucesión -- es 2.000 -- --------------------------------------------------------------------- -- Ejercicio 3. Definir la función -- u' :: Int -> Float -- tal que (u' n) es el n-ésimo término de la sucesión u. -- --------------------------------------------------------------------- u' :: Int -> Double u' 0 = 3/2 u' 1 = 5/3 u' n = 2003 - 6002/(u' (n-1)) + 4000/((u' (n-1))*(u' (n-2))) -- --------------------------------------------------------------------- -- Ejercicio 4. Calcular los 10 primeros términos de la sucesión u' y -- conjeturar el límite de la sucesión u. -- --------------------------------------------------------------------- -- El cálculo es -- ghci> [(n, u' n) | n <- [0..9]] -- [(0,1.5), -- (1, 1.6666666666666667), -- (2, 1.800000000000182), -- (3, 1.8888888890910494), -- (4, 1.941176684634911), -- (5, 1.9699174994632358), -- (6, 2.2085111769288233), -- (7, 204.74869262199354), -- (8,1982.5318590274205), -- (9,1999.9824122480152)] -- A partir de lo anterior, la conjetura es que el límite de la sucesión -- es 2.000 -- --------------------------------------------------------------------- -- Ejercicio 5. Definir la función -- u'' :: Int -> Float -- tal que (u'' n) es el n-ésimo término de la sucesión u. -- --------------------------------------------------------------------- u'' :: Int -> Rational u'' 0 = 3 % 2 u'' 1 = 5 % 3 u'' n = 2003 - 6002/(u'' (n-1)) + 4000/((u'' (n-1))*(u'' (n-2))) -- --------------------------------------------------------------------- -- Ejercicio 6. Calcular el valor decimal de los 10 primeros términos -- de la sucesión u'' y conjeturar el límite de la sucesión u. -- --------------------------------------------------------------------- -- El cálculo es -- ghci> [(n, fromRational (u'' n)) | n <- [0..9]] -- [(0,1.5), -- (1,1.6666666666666667), -- (2,1.8), -- (3,1.8888888888888888), -- (4,1.9411764705882353), -- (5,1.9696969696969697), -- (6,1.9846153846153847), -- (7,1.9922480620155039), -- (8,1.9961089494163424), -- (9,1.9980506822612085)] -- A partir de lo anterior, la conjetura es que el límite de la sucesión -- es 2. |