乐正

Actions speak louder than words.

Sicp-ex3-59

问题

在2.5.3节里,我们说明了如何实现一个多项式算数系统,其中将多项式表示为项的表。我们可以按类似的方式处理幂级数,例如,将

$$ \begin{align} & e^x = 1 + x + \frac {x^2} {2} + \frac {x^3} {3 \cdotp 2} + \frac {x^4} {4 \cdotp 3 \cdotp 2} + \cdots, \\ & \cos x = 1 - \frac {x^2} {2} + \frac {x^4}{4 \cdotp 3 \cdotp 2} - \cdots, \\ & \sin x = x - \frac {x^3} {3 \cdotp 2} + \frac {x^5} {5 \cdotp 4 \cdotp 3 \cdotp 2} - \cdots \end{align} $$

表示为无穷的流,我们把级数$a_0 + a_1x + a_2x^2 + a_3x^3 + \cdots$表示为流,流的元素就是级数的系数$a_0, a_1, a_2, a_3, \cdots$。

a) 级数$a_0 + a_1x + a_2x^2 + a_3x^3 + \cdots$的积分是级数:

$$ c + a_0x + \frac {1} {2} a_1x^2 + \frac {1} {3} a_2x^3 + \frac {1} {4} a_3x^4 + \cdots $$

这里$c$是任意常数。请定义过程integrate-series,它以一个表示幂级数的流$a_0, a_1, \cdots$为参数,返回这个幂级数的积分中各个非常数项的系数流$a_0, \frac {1} {2} a_1, \frac {1} {3} a_2, \cdots$。(因为返回的记过中不包含常数项,因此它不是幂级数。如果要对它们使用integrate-series,我们可以用cons加上一个常数项。)

b) 函数$x \mapsto e^x$是其自身的导数。这也意味着$e^x$和$e^x$的积分是同一个级数,除了常数项之外。而常数项应该是$e^0 = 1$。根据这种情况,我们可以按如下方式生成$e^x$的级数:

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

我们知道$\sin$的导数是$\cos$,$\cos$的导数是负的$\sin$,请说明如何根据这些事实,生成$\sin$和$\cos$的级数:

1
2
3
4
5
(define cosin-series
  (cons-stream 1 <??>))

(define since-series
  (cons-stream 0 <??>))

解答

练习3.59 (ex3-59.scm) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(define (integrate-series stream)
  (stream-map (lambda (a n)
                      (* a (/ 1 n)))
              stream
              integers))

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

(define cosine-series
  (cons-stream 1 (stream-map - (integrate-series sine-series))))

(define sine-series
  (cons-stream 0 (integrate-series cosine-series)))

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
;; cosine

(stream-ref cosine-series 0)
;Value: 1

(stream-ref cosine-series 1)
;Value: 0

(stream-ref cosine-series 2)
;Value: -1/2

(stream-ref cosine-series 4)
;Value: 1/24

(stream-ref cosine-series 6)
;Value: -1/720

;; sine

(stream-ref sine-series 0)
;Value: 0

(stream-ref sine-series 1)
;Value: 1

(stream-ref sine-series 3)
;Value: -1/6

(stream-ref sine-series 5)
;Value: 1/120

(stream-ref sine-series 7)
;Value: -1/5040

draft

« sicp-ex3-58 sicp-ex3-60 »

Comments