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

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

  1. albcercid
    aproximacionPi :: Int -> Double
    aproximacionPi n = 2 * aux (sqrt 2) 0
      where aux v x | x == n    = 1
                    | otherwise = (2 / v) * aux (sqrt (2 + v)) (x + 1)
     
    errorPi :: Double -> Int
    errorPi n = aux n 0
      where aux n x | abs (pi - aproximacionPi x) < n = x
                    | otherwise                       = aux n (x + 1)
  2. enrnarbej
    aproximacionPi :: Int -> Double
    aproximacionPi n =
      (product . take (n+1) . zipWith (/) [2,2..]) (1 : sucVieta 0)
     
    sucVieta :: Double -> [Double]
    sucVieta x = sq : sucVieta sq
      where sq = sqrt (2+x)
     
    errorPi :: Double -> Int
    errorPi e = head [n | n <- [1..]
                        , abs (pi - aproximacionPi n) <= e]
  3. eliguivil
    aproximacionPi :: Int -> Double
    aproximacionPi n =  product [2 / radicando k | k <- [1..n+1]]
     
    radicando :: Int -> Double  
    radicando 1 = 1
    radicando 2 = sqrt 2
    radicando n = sqrt (2 + radicando (n-1))
     
    errorPi :: Double -> Int
    errorPi e = aux e (2/radicando 1) 1 -1
      where
        aux e a n | abs (pi-a) < e = n
                  | otherwise      = aux e (a*2/radicando (n+1)) (n+1)
  4. artmorfer
    aproximacionPi :: Int -> Double
    aproximacionPi 0 = 2
    aproximacionPi n = (2 / sucesionCuadrados n) *  aproximacionPi (n-1)
     
    sucesionCuadrados :: Int -> Double
    sucesionCuadrados 0 = 0
    sucesionCuadrados n = sqrt (2 + sucesionCuadrados (n-1))
     
    errorPi :: Double -> Int
    errorPi m = head [n | n <- [1..] , abs (pi - aproximacionPi n) <= m]
  5. monlagare
    aproximacionPi :: Int -> Double
    aproximacionPi n =
      product (take (n+1) (zipWith (/) [2,2..] (1 : sucVieta 0)))
     
    sucVieta :: Double -> [Double]
    sucVieta x = sqrt (2+x) : sucVieta (sqrt (2+x))
     
    errorPi :: Double -> Int
    errorPi x = head [n | n <- [1..], abs (pi - aproximacionPi n) <= x]
  6. antmorper3
    aproximacionPi :: Int -> Double
    aproximacionPi n = 2^^(n+1) / product xs
      where xs = take n $ iterate (x -> sqrt (2+x)) (sqrt 2)
     
    errorPi :: Double -> Int
    errorPi x = head [n | n <- [0..], abs (pi - aproximacionPi n) <= x]
  7. migibagar
    aproximacionPi :: Int -> Double
    aproximacionPi 0 = 2
    aproximacionPi n = (2 / denoms n) * aproximacionPi (n-1)
     
    denoms :: Int -> Double
    denoms 0 = 1
    denoms 1 = sqrt 2
    denoms n = sqrt (2 + denoms (n-1))
     
    errorPi :: Double -> Int
    errorPi x = head [k | k <- [1..], abs(aproximacionPi k - pi) < x]
  8. manruiber
    aproximacionPi :: Int -> Double
    aproximacionPi n = productos !! n
     
    productos :: [Double]
    productos = scanl (*) 2 (tail factores)
      where factores = zipWith (/) [2,2..] (1 : sucesion 0)
     
    sucesion :: Double -> [Double]
    sucesion k = sqrt (2+k) : sucesion (sqrt (2+k))
     
    errorPi :: Double -> Int
    errorPi n = length $ takeWhile (k -> abs (pi - k) >= n) productos
  9. Juanjo Ortega (juaorture)
    aproximacionPi :: Int -> Double
    aproximacionPi n =  product $ 2 : take n (map (2/) xs)
      where xs = sqrt 2 : [sqrt (2 + x) | x <- xs]
     
    errorPi :: Double -> Int
    errorPi x = head [ k | k <- [0..]
                         , abs (aproximacionPi k - pi) <= x]
  10. marlobrip
    aproximacionPi :: Int -> Double
    aproximacionPi n = product (take (n+1) sucVieta)
     
    sucVieta :: [Double]
    sucVieta = 2 : map inv (aux 0)
      where aux x = sqrt (2+x) : aux (sqrt (2+x))
            inv x = 2/x
     
    errorPi :: Double -> Int
    errorPi n = head [x | x <- [1..], abs (pi - aproximacionPi x)< n]
  11. Chema Cortés
    sucVieta :: [Double]
    sucVieta =  (2/) <$> 1 : iterate (x -> sqrt(2+x)) (sqrt 2)
     
    aproximacionPi :: Int -> Double
    aproximacionPi n = product $ take (n+1) sucVieta
     
    errorPi :: Double -> Int
    errorPi x = length $ takeWhile aux (scanl1 (*) sucVieta)
      where
        aux z = abs (pi - z) >= x
  12. Alejandro

    Con la librería Data.Number.BigFloat

    import Data.Number.BigFloat
     
    aproximacionPi :: Int -> BigFloat Prec50
    aproximacionPi n = product [2 / aux x | x <- [0..n]]
      where
        aux 0 = 1
        aux 1 = sqrt 2
        aux n = sqrt (2 + aux (n-1))
     
    -- Ejemplos: 
    --    λ> aproximacionPi 25
    --    3.14159265358979209099990077104882052540214241296856e0
    --    λ> pi :: BigFloat Prec50
    --    3.14159265358979323846264338327950288419716939937511e0
  13. cescarde
    aproximacionPi :: Int -> Double
    aproximacionPi n = product $ zipWith (/) (repeat 2) (sucRaiz' (n+1))
     
    sucRaiz :: Int -> Double
    sucRaiz 1 = sqrt 2
    sucRaiz n = sqrt (2+ sucRaiz (n-1))
     
    sucRaiz' :: Int -> [Double]
    sucRaiz' n = 1 : [sucRaiz x | x <- [1..n-1]]
     
    errorPi :: Double -> Int
    errorPi n = head [ x | x <- [1..], abs (pi -aproximacionPi x) < n]

Escribe tu solución

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