如何编写这样的泰勒级数递归数据:
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 个第一元素之和。
如何编写这样的泰勒级数递归数据:
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 个第一元素之和。
这不完全是泰勒级数!但这里有一个线索......
products = scanl (*) 1 [1..]
powers x = map (x^) [0..]
exp' x = zipWith (/) (powers x) products
*Main> sum (take 10 (exp' 1))
2.7182815255731922
一种常见的方法是使用一个列表来仅表示幂级数的系数,并编写另一个函数来评估特定值的幂级数。
例如,幂级数 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
您想要求和的最高幂,而不是总和中非零项的数量。