试图在Haskell中进行pi近似

时间:2016-03-26 19:36:19

标签: haskell pi taylor-series

好的,所以我试图根据您提供给该功能的泰勒扩展中的术语数来近似pi。但是我收到很多错误,最后一个是无法推断实例:

这是我的代码:

pie :: Rational -> Rational
pie n = 4.0 * (pie_h n 1.0)

pie_h :: Rational -> Rational
pie_h x y = if(x==0) then 0.0 
             else if ((y mod 2.0)/=0) then (1.0/y)+ pie_h (x-1.0) (y+2.0)
             else (-1.0/y)+(pie_h (x-1.0) (y+2.0))

2 个答案:

答案 0 :(得分:1)

类型签名错误。你说pie_h是一个函数,它接受一个参数Rational,然后返回一个Rational,然后将它定义为一个带有两个参数的函数,xy

pie_h :: Rational -> Rational -> Rational
pie_h x y = ...

您还可以通过模式匹配简化这一点,并将唯一不同的因素分解出来,即第一个术语的符号。

pie_h 0 _ = 0.0
pie_h x y = (if even y then -1 else 1) / y + pie_h (x - 1.0) (y + 2.0)

答案 1 :(得分:1)

如果你使用Leibniz's formula作为pi,它就不会收敛于n的任何实际值。

无论效率如何,您都可以更直接的方式实施

定义反转函数(\x->1/x)和交替和函数(x1-x2 + x3 ......)

例如,

import Ratio

invert :: Integer -> Rational
invert x = 1%x

altsum :: (Num a) => [a] -> a
altsum [] = 0
altsum (x:xs) = x - altsum xs

现在,将两者与奇数系列相结合

fromRational $ (*) 4 $ altsum $ take 100 $ map invert [1,3..]

给出

3.131592903558553

您可以将approx_pi函数定义为

approx_pi n = (fromRational . (*) 4 . altsum . take n . map invert) [1,3..]