2

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

fib = 0 : scanl (+) 1 fib

例如,我想要这样的提示:

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

并得到正弦泰勒级数的 10 个第一元素之和。

4

2 回答 2

8

这不完全是泰勒级数!但这里有一个线索......

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

*Main> sum (take 10 (exp' 1))
2.7182815255731922
于 2014-01-30T20:56:32.090 回答
3

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

例如,幂级数 1/(1-x)^2 = 1 + 2x + 3x^2 + ... 将由 list 表示[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您想要求和的最高幂,而不是总和中非零项的数量。

于 2014-01-30T21:13:59.187 回答