泰勒系列在haskell

时间:2014-01-30 20:20:28

标签: math haskell recursion taylor-series

如何编写像这样的泰勒级数递归数据:

fib = 0 : scanl (+) 1 fib

例如,我想要promt这样的东西:

fac n = product[1..n]
sin' x = x : x^3/fac(3) : x^5/fac(5) : ...
sum $ take 10 (sin' (pi/6))

获得正弦泰勒系列的10个第一要素的总和。

2 个答案:

答案 0 :(得分:8)

这不是泰勒系列的罪恶!但这是一个线索...

products = scanl (*) 1 [1..]
powers x = map (x^) [0..]
exp' x = zipWith (/) (powers x) products

*Main> sum (take 10 (exp' 1))
2.7182815255731922

答案 1 :(得分:3)

一种常见的方法是使用一个列表来表示幂级数的系数,并编写另一个函数来评估特定值的幂级数。

例如,幂列表1 /(1-x)^ 2 = 1 + 2x + 3x ^ 2 + ...将由列表[1,2,3,...]表示。

为了评估它,我们需要一个函数:

eval :: [Float] -> Float -> Float

基本案例很简单:

eval [] x = 0

归纳案例可以递归定义:

eval (a:as) x = a + x*...   -- left as an exercise

当然,这个eval不会在无限列表中终止,所以你必须确保只给它有限的列表:

sin' = [ 1, 0, - 1 / fac 3, 0, 1 / fac 5, 0, ... ]
eval (take 10 sin') (pi/6)

现在你只需要生成sin'的系数。请注意,在这种情况下,10指的是您想要求和的最高幂x,而不是总和中非零项的数量。