Scheme 视角下的无穷流和幂级数

Scheme 视角下的无穷流和幂级数_第1张图片
007.jpg

这时一份笔记。描述了 Schema 的 stream 接口的使用示例;用它来模拟了无穷幂级数。

表示

幂级数可以用级数的系数表示。例如下面的指数函数的幂级数展开:

可以用如下的列表表示:

(1 1 1/2 1/6 1/24 ...)

将这些系数看作一个无穷的流,则可以用无穷流表示幂级数。

幂级数的积分

的对 的不定积分是 。下面这段程序表示了 之外的级数:

(define (integrate-series series)
  (let loop ((s series)
             (n 1))
     (cons-stream (/ (stream-car s) n)
                  (loop (stream-car s) (+ n 1)))))

那么,(cons-stream c (integrate-series s)) 就是 s 的一个积分函数。

指数函数

指数函数具有求导不变的特性,利用这一点,可以得到指数函数的级数。

(define exp-series
  (cons-stream 1 (integrate-series exp-series)))

计算机完成了超出多数人想象的更加抽象的计算。

正弦和余弦函数

(define sin-series
  (cons-stream 0 (integrate-series cos-series)))

(define cos-series
  (cons-stream 1 (stream-scale (integrate-series sin-series) -1)))

级数运算

定义了一些级数之后,还需要定义一些运算。

(define add-series add-streams)

(define (mul-series s1 s2)
  (let* ((s1car (stream-car s1))
         (s1cdr (stream-cdr s1))
         (s2-x-s1car (stream-scale s2 s1car)))
    (cons-stream (stream-car s2-x-s1car)
                 (add-streams (stream-cdr s2-x-s1car)
                              (mul-series s1cdr s2)))))

由于把无穷对象看作有穷对象,计算级数的乘积不再需要复杂的逻辑。

可以验证 这个定理。

(define should-be-one
  (add-series (mul-series sin-series sin-series)
              (mul-series cos-series cos-series)))
(print-first-n should-be-one 10)

人生苦短。

你可能感兴趣的:(Scheme 视角下的无穷流和幂级数)