理系学生日記

おまえはいつまで学生気分なのか

問題 3-59 (3.5.2 Infinite Streams)

課題 a

a_0,a_1,a_2,a_3,\cdots という無限ストリームが与えられたとき,a_0,\frac 12 a_1, \frac 13 a_2, \frac 14 a_3,\cdots を返す関数 integrate-series を作成します.なんでこの関数が integrate-series という名前になっているかというと,a_0+a_1x+a_2x^2+a_3x^3+\cdots の積分が a_0x+\frac 12 a_1x^2+\frac 13 a_2x^3 + \frac 14 a_3x^4+\cdots となり,その積分の係数が返されているからですね (定数項は除く).

(define (add-stream s1 s2)
  (stream-map + s1 s2))
(define integers (cons-stream 1 (add-stream ones integers)))

(define (integrate-series S)
  (stream-map / S integers))

ここでは,ones (=1,1,1,1,\cdots) を渡してみます.

(define S (integrate-series ones))
(dump-stream S 5) ;1, 1/2, 1/3, 1/4, 1/5, done

ふむ,いい感じだ.

課題 b

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

上の関数を見るとなんとなくわかるかもしれないですが, e^x \int e^x dx は定数項 (積分定数) 以外は同じですから,e^x をマクローリン展開したときの数列は上記のように書ける.
じゃぁ,\cos x, \sin x をマクローリン展開したときのも書いてみようよ!

(define cosine-series
  (cons-stream 1 (integrate-series
                  (stream-map (lambda (x) (* x -1)) sine-series))))
(define sine-series
  (cons-stream 0 (integrate-series cosine-series)))

\cos x = \int (- \sin x) dx ですし,\sin x = \int \cos x dx ですから,上記のような定義で数列は完成するはずだ.

(dump-stream cosine-series 10) ; 1, 0, -1/2, 0, 1/24, 0, -1/720, 0, 1/40320, 0, done
(dump-stream sine-series 10)   ; 0, 1, 0, -1/6, 0, 1/120, 0, -1/5040, 0, 1/362880, done