Menu Close

Cálculo de pi mediante la serie de Madhava

El mes de marzo es el mes de pi, ya que el 14 de marzo (3/14) es el día de pi. Con ese motivo, el pasado 1 de marzo se publicó en Twitter un mensaje con la fórmula de Madhava para el cálculo de pi

Definir las funciones

   aproximacionPi :: Int -> Double
   grafica        :: Int -> IO ()

tales que

  • (aproximacionPi n) es la n-ésima aproximación de pi con la fórmula de Madhava. Por ejemplo,
     aproximacionPi 0   ==  3.4641016151377544
     aproximacionPi 1   ==  3.0792014356780038
     aproximacionPi 2   ==  3.156181471569954
     aproximacionPi 10  ==  3.1415933045030813
     aproximacionPi 21  ==  3.1415926535879337
     pi                 ==  3.141592653589793
  • (grafica n) dibuja la gráfica de las k-ésimas aproximaciones de pi para k desde 0 a n. Por ejemplo, (grafica 30) dibuja

Soluciones

import Graphics.Gnuplot.Simple (Attribute (Key), plotList)
 
aproximacionPi :: Int -> Double
aproximacionPi n =
  sqrt 12 * aux (fromIntegral n)
  where
    aux 0 = 1
    aux n = aux (n-1) + (-1)**n/(3**n*(2*n+1))
 
grafica :: Int -> IO ()
grafica n =
    plotList [ Key Nothing
             -- , PNG "Calculo_de_pi_mediante_la_serie_de_Madhava_1.png"
             ]
             [aproximacionPi n | n <- [0..n]]

Nuevas soluciones

  • En los comentarios se pueden escribir nuevas soluciones.
  • El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>

5 soluciones de “Cálculo de pi mediante la serie de Madhava

  1. Rubén Muñoz Mkrtchian
    aproximacionPi :: Int -> Double
    aproximacionPi n = sqrt 12 * sum (take (n+1) sumandos)
      where sumandos = zipWith (/) numeradores denominadores
              where numeradores = cycle [1,-1]
                    denominadores = zipWith (*) (map (3^) [0..]) [1,3..]
     
    -- Para representar la gráfica, vamos a definir la lista cuyo k-ésimo elemento
    -- es la k-ésima aproximación al número pi a partir de la fórmula de Madhava.
     
    aproximacionesPi :: [Double]
    aproximacionesPi = map aproximacionPi [0..]
     
    grafica :: Int -> IO ()
    grafica n = plotList [Key Nothing] (take (n+1) aproximacionesPi)
  2. Mercedes Vega Gallo
    import Graphics.Gnuplot.Simple
     
    aproximacionPi :: Int -> Double
    aproximacionPi n = sqrt 12 * sum (map (1/) lista)
          where lista = take (n+1) $ zipWith3 (x y z-> x*y*z) (cycle [1,-1]) [1,3..] (map (3^) [0..])
     
    grafica :: Int -> IO ()
    grafica n = plotList [Title "APROXIMACION DE PI", Key Nothing] (zip  [0..n] (map aproximacionPi [0..n]))
  3. Joaquín Infante Rodríguez
     
    import Graphics.Gnuplot.Simple
    import Data.List
     
    listaAproximaciones :: [Double]
    listaAproximaciones = [((-1)**x)/((3**x)*(2*x+1)) | x<-[0..]]
     
    aproximacionPi :: Int -> Double
    aproximacionPi n = sqrt 12 * (sum $take (n+1) $listaAproximaciones)
     
    grafica :: Int -> IO ()
    grafica n = plotList [Title "CALCULO DE PI CON MADHAVA", Key Nothing] $take n listaAproximaciones
  4. Joaquín Infante Rodríguez
    import Graphics.Gnuplot.Simple
    import Data.List
     
    --La función grafica n de mi anterior comentario no es correcta. 
    --Ahora sí está bien el ejercicio
     
    aproximacionPi :: Int -> Double
    aproximacionPi n = sqrt 12 * (sum $take (n+1) $[((-1)**x)/((3**x)*(2*x+1)) | x<-[0..]])
     
    aproximacionesPiLista :: [Double]
    aproximacionesPiLista = map aproximacionPi [0..]
     
    grafica :: Int -> IO ()
    grafica n = plotList [Title "CALCULO DE PI CON MADHAVA", Key Nothing] (take (n) (aproximacionesPiLista))
  5. Alejandro Garcia Alcaide
    import Graphics.Gnuplot.Simple
     
    aproximacionPi :: Int -> Double
    aproximacionPi n =  sqrt (12) * (sum $ take (n+1) (lista))
     
    -- Definimos una funcion auxiliar. 
    lista ::  [Double]
    lista  = 1 : [(-1)**(i+1)/ (3**n*(2*n+1)) | (i,n) <- zip [0..] [1..]]
     
    -- Por ultimo, la grafica quedaria:
    grafica :: Int -> IO ()
    grafica n =
      plotList [Title "Aproximaciones de Pi", XLabel "Eje Horizontal", YLabel "Eje Vertical"] [aproximacionPi x | x <- [0..n]]

Leave a Reply

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