Menu Close

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 u:

\begin{array}{l}     u_0 = \frac{3}{2} \\ \\     u_1 = \frac{5}{3} \\ \\     u_{n} = 2003 - \frac{6002}{u_{n-1}} + \frac{4000}{u_{n-1} \cdot u_{n-2}},         \mbox{ para } n \geq 2     \end{array}

usando en cada caso uno de los tipos y conjeturando el límite de la sucesión.

-- ---------------------------------------------------------------------
-- § 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.
Haskell