(graficas xs) dibuja la gráfica de las k-ésimas aproximaciones de pi, donde k toma los valores de la lista xs, con las fórmulas de Gregory-Leibniz y de Beeler. Por ejemplo, (graficas [1..25]) dibuja donde la línea morada corresponde a la aproximación de Gregory-Leibniz y la verde a la de Beeler.
Soluciones
import Graphics.Gnuplot.Simple
-- Definiciones de aproximaPiGL-- ============================-- 1ª definición de aproximaPiGL
aproximaPiGL ::Int->Double
aproximaPiGL n =4*(sum . take n . sumaA . zipWith(/)[1,1..])[1,3..]where sumaA (x:y:xs)= x:(-y):sumaA xs
-- 2ª definición de aproximaPiGL
aproximaPiGL2 ::Int->Double
aproximaPiGL2 n =4*(sum(take n (zipWith(/)(cycle[1,-1])[1,3..])))-- 3ª definición de aproximaPiGL
aproximaPiGL3 ::Int->Double
aproximaPiGL3 n =4*(sum . take n . zipWith(/)(cycle[1,-1]))[1,3..]-- 4ª definición de aproximaPiGL
aproximaPiGL4 ::Int->Double
aproximaPiGL4 n = serieGL !!(n-1)
serieGL ::[Double]
serieGL =scanl1(+)(zipWith(/) numeradores denominadores)where numeradores =cycle[4,-4]
denominadores =[1,3..]-- Definición de aproximaPiBeeler
aproximaPiBeeler ::Int->Double
aproximaPiBeeler n =2* aux (fromIntegral n)1where
aux ::Double->Double->Double
aux n k | n == k =1|otherwise=1+(k/(2*k+1))* aux n (1+k)-- Definición de graficas
graficas ::[Int]->IO()
graficas xs =
plotLists [Key Nothing][[(k,aproximaPiGL k)| k <- xs],
[(k,aproximaPiBeeler k)| k <- xs]]
Otras soluciones
Se pueden escribir otras soluciones en los comentarios.
El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
import Graphics.Gnuplot.Simple
aproximaPiGL ::Int->Double
aproximaPiGL n =4*sum[(-1)**(k+1)/(2*k-1)| k <-[1,2..fromIntegral(n)]]
aproximaPiBeeler ::Int->Double
aproximaPiBeeler n =2* aux [k/(2*k+1)| k <-[1.. fromIntegral(n-1)]]where aux []=1
aux (x:xs)=1+ x * aux xs
graficas ::[Int]->IO()
graficas xs =
plotLists [ Key Nothing
, Title "Aproximaciones de Pi: Gregory-Leibniz y de Beeler"][map aproximaPiGL xs, map aproximaPiBeeler xs]
import Graphics.Gnuplot.Simple
aproximaPiGL ::Int->Double
aproximaPiGL 1=4
aproximaPiGL n
|even n = a - m
|otherwise= a + m
where a = aproximaPiGL (n-1)
m =4/[3,5..]!!(n-2)
aproximaPiBeeler ::Int->Double
aproximaPiBeeler n =2*foldr f 1 xs
where f (a,b) xs =1+ a/b * xs
xs =[(x,2*x+1)| x <-[1..fromIntegral(n-1)]]
graficas ::[Int]->IO()
graficas xs =
plotLists [Key Nothing, PNG "graficasGLyB.png"][map aproximaPiGL xs, map aproximaPiBeeler xs]
import Graphics.Gnuplot.Simple
aproximaPiGL ::Int->Double
aproximaPiGL n =4*(sum$take n [(-1)**n/(2*n+1)| n <-[0..]])
aproximaPiBeeler ::Int->Double
aproximaPiBeeler n =2*(aux n 1)where aux n m
| n ==1=1| m == n-1=1+ m'/(2*m'+1)|otherwise=1+ m'/(2*m'+1)*(aux n (m+1))where m' =fromIntegral m
graficas ::[Int]->IO()
graficas ns =
plotLists [Key Nothing, PNG "calculoPiLeibnizBeeler.png"][map aproximaPiGL ns, map aproximaPiBeeler ns]
Otra forma de calcular la aproximación de Gregory-Leibniz: