Menu Close

Cálculo de pi usando la fórmula de Vieta

La fórmula de Vieta para el cálculo de pi es la siguiente
Calculo_de_pi_usando_la_formula_de_Vieta

Definir las funciones

   aproximacionPi :: Int -> Double
   errorPi :: Double -> Int

tales que

  • (aproximacionPi n) es la aproximación de pi usando n factores de la fórmula de Vieta. Por ejemplo,
     aproximacionPi  5  ==  3.140331156954753
     aproximacionPi 10  ==  3.1415914215112
     aproximacionPi 15  ==  3.141592652386592
     aproximacionPi 20  ==  3.1415926535886207
     aproximacionPi 25  ==  3.141592653589795
  • (errorPi x) es el menor número de factores de la fórmula de Vieta necesarios para obtener pi con un error menor que x. Por ejemplo,
     errorPi 0.1        ==  2
     errorPi 0.01       ==  4
     errorPi 0.001      ==  6
     errorPi 0.0001     ==  7
     errorPi 1e-4       ==  7
     errorPi 1e-14      ==  24
     pi                 ==  3.141592653589793
     aproximacionPi 24  ==  3.1415926535897913

Soluciones

-- 1ª definición de aproximacionPi
aproximacionPi :: Int -> Double
aproximacionPi n = product [2 / aux x | x <- [0..n]]
  where
    aux 0 = 1
    aux 1 = sqrt 2
    aux n = sqrt (2 + aux (n-1))
 
-- 2ª definición de aproximacionPi
aproximacionPi2 :: Int -> Double
aproximacionPi2 n = product [2/x | x <- 1 : xs] 
  where xs = take n $ iterate (\x -> sqrt (2+x)) (sqrt 2)
 
-- 3ª definición de aproximaxionPi
aproximacionPi3 :: Int -> Double
aproximacionPi3 n =  product (2 : take n (map (2/) xs))
  where xs = sqrt 2 : [sqrt (2 + x) | x <- xs]
 
-- 1ª definición de errorPi
errorPi :: Double -> Int
errorPi x = head [n | n <- [1..]
                    , abs (pi - aproximacionPi n) < x]
 
-- 2ª definición de errorPi
errorPi2 :: Double -> Int
errorPi2 x = until aceptable (+1) 1
  where aceptable n = abs (pi - aproximacionPi n) < x

Pensamiento

El tiempo que la barba me platea,
cavó mis ojos y agrandó mi frente,
va siendo en mi recuerdo transparente,
y mientras más al fondo, más clarea.

Antonio Machado

5 soluciones de “Cálculo de pi usando la fórmula de Vieta

  1. sersanpav
    aproximacionPi :: Integer -> Double
    aproximacionPi n = product (2:[2/k | k <- listaSucesionRaiz n])
     
    listaSucesionRaiz :: Integer -> [Double]
    listaSucesionRaiz m = [sucesionRaiz n | n <- [1..m]]
     
    sucesionRaiz :: Integer -> Double
    sucesionRaiz 1 = sqrt 2
    sucesionRaiz n = sqrt (2 + sucesionRaiz (n-1))
     
    errorPi :: Double -> Int
    errorPi m = head [n | n <- [1..], abs (aproximacionPi n - pi) <= m]
  2. goncarmar1
    aproximacionPi :: Int -> Double
    aproximacionPi n = product[ 2 / (radicales a) | a <- [1..(n+1)]]
     
    radicales :: Int -> Double
    radicales n
      | n > 2  = sqrt (2 + radicales (n-1))
      | n == 2 = sqrt 2
      | n <= 1 = 1
     
    errorPi :: Double -> Int
    errorPi x = head [n | n <- [1..], pi - aproximacionPi n < x]
  3. alvhurmat
     
    aproximacionPi :: Int -> Double
    aproximacionPi 1 = 2
    aproximacionPi n = (2 / (aproxAux n)) * (aproximacionPi (n-1))
     
    aproxAux :: Int -> Double
    aproxAux 2 = 2**(1/2)
    aproxAux n = (2 + aproxAux (n-1))**(1/2)
     
    errorPi :: Double -> Int
    errorPi x = head [n | n <- [1..], pi - aproximacionPi n <= x]
  4. juabaerui
    aproximacionPi :: Int -> Double
    aproximacionPi n = product [2 / termino k | k <- [0..n]]
     
    termino :: Int -> Double
    termino 0 = 1
    termino 1 = sqrt 2
    termino n = sqrt (2 + termino (n-1))
     
    errorPi :: Double -> Int
    errorPi n = head [ k | k <- [1..],(abs (pi - aproximacionPi k) < n)]
  5. fercarnav

    aproximacionPi :: Int -> Double
    aproximacionPi n = 2^(n+1) / product (take n (viena 0))
     
    viena :: Double -> [Double]
    viena n = sqrt (2+n) : viena (sqrt (2+n))
     
    errorPi :: Double -> Int
    errorPi n = auxPi n 2 0 (map (2/) (viena 0))
     
    auxPi :: Double -> Double -> Int -> [Double] -> Int
    auxPi x y c (z:zs) 
      | abs (pi - y) > x = auxPi x (y*z) (c+1) zs
      | otherwise        = c

Leave a Reply

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