无穷流和幂级数

2018-11-30  本文已影响4人  家中古词

幂级数可以用级数的系数表示。

e^x = 1 + x + \frac{x^2}{2} + \frac{x^3}{6} + \frac{x^4}{24} + \dots

可以用:

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

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

幂级数的积分

a_0 + xa_1 + x^2a_2 + ... 的积分是 c + a_0x + \frac{a_1x^2}{2} + \frac{a_2x^3}{3}。用无穷流表示除了 c 之外的系数,用程序表示是:

(define (integrate-series s)
  (define (get s n)
    (cons-stream (/ (stream-car s) n)
                 (get (stream-cdr s) (+ n 1))))
  (get s 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)))))

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

验证

可以验证 \sin^2(x) + \cos^2(x) = 1 这个定理。

(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)

人生苦短。

上一篇下一篇

猜你喜欢

热点阅读