Menu Close

Aproximación entre pi y e

El día 11 de noviembre, se publicó en la cuenta de Twitter de Fermat’s Library la siguiente curiosa identidad que relaciona los números e y pi:

Definir las siguientes funciones:

   sumaTerminos :: Int -> Double
   aproximacion :: Double -> Int

tales que

  • (sumaTerminos n) es la suma de los primeros n términos de la serie 1/(π²+ 1) + 1/(4π²+1) + 1/(9π²+1) + 1/(16π²+ ) + … Por ejemplo,
     sumaTerminos 10     ==  0.14687821811081034
     sumaTerminos 100    ==  0.15550948345688423
     sumaTerminos 1000   ==  0.15641637221314514
     sumaTerminos 10000  ==  0.15650751113789382
  • (aproximación x) es el menor número de términos que hay que sumar de la serie anterior para que se diferencie (en valor absoluto) de 1/(e²-1) menos que x. Por ejemplo,
     aproximacion 0.1     ==  1
     aproximacion 0.01    ==  10
     aproximacion 0.001   ==  101
     aproximacion 0.0001  ==  1013

Soluciones

-- 1ª definición de sumaTerminos
sumaTerminos :: Int -> Double
sumaTerminos n =
  sum [1 / (((x ^ 2) * (pi ^ 2)) + 1) | x <- [1 .. fromIntegral n]]
 
-- 2ª definición de sumaTerminos
sumaTerminos2 :: Int -> Double
sumaTerminos2 0 = 0
sumaTerminos2 n = 1 / (m^2 * pi^2 + 1) + sumaTerminos2 (n-1)
  where m = fromIntegral n
 
-- Definición de aproximacion
aproximacion :: Double -> Int
aproximacion x =
  head [n | n <- [0..]
          , abs (sumaTerminos n - 1 / (e^2 - 1)) < x]
  where e = exp 1

Pensamiento

“Sólo sé que no se nada” contenía la jactancia de un excesivo saber, puesto que olvidó añadir: y aun de esto mismo no estoy completamente seguro.

Antonio Machado

3 soluciones de “Aproximación entre pi y e

  1. frahidzam
    sumaTerminos :: Int -> Double
    sumaTerminos n =
      sum [1 / (((x ^ 2) * (pi ^ 2)) + 1) | x <- [1 .. fromIntegral n]]
     
    aproximacion :: Double -> Int
    aproximacion x =
      head  [n | n <- [1..]
               , abs (sumaTerminos n - (1 / (exp 1 ^ 2 - 1)))  < x]
  2. luipromor
    sumaTerminos :: Int -> Double
    sumaTerminos x = sum [(1 + (pi * n) ^ 2 ) ** (-1) | n <- [1..y]]
      where y = fromIntegral x 
     
    aproximacion :: Double -> Int
    aproximacion n =
      head [ x | x <- [1..]
               , abs (((exp 1 ^2 - 1 ) ** (-1)) - sumaTerminos x) < n]
  3. javmarcha1
     
    sumaTerminos :: Int -> Double
    sumaTerminos n = sum [ (1/((y^2)*(pi ^ 2)+1)) | y <- [1..fromIntegral n]]
     
    aproximacion :: Double -> Int
    aproximacion x =  head  [n | n <- [1..] ,
                             (sumaTerminos n - (1 / (exp 1 ^ 2 - 1)))^2  < x^2]

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.