理系学生日記

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

問題 3-62 (3.5.2 Infinite Streams)

理系の人間は,\tan x の級数展開には苦しめられたことだと思います.高次微分とかはメンドくて,しかも \tan x とかは \sin x とか \cos x とかの級数展開と違ってあんまし美しくもない.
メンドいのは全部 PC にやらせれば良いと思う.ここでは,べき級数を割り算するというヤバげな問題にチャレンジします.

チャレンジといっても,べき級数 S に対して 1/S のべき級数を求める関数は問題 3-61 で,べき級数同士を乗算した結果のべき級数を求める関数は問題 3-60 で既に求まっていますから,あとはこれを組み合わせれば良いですね.

(define (div-series A B)
  (if (= (stream-car B) 0)
      (error "denominator's contant is 0")
      (mul-series A
                  (invert-unit-series B))))

これを使うと \tan x のマクローリン展開なんてクソみたいに簡単だ.\tan x=\frac{\sin x}{\cos 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)))
(define tangent-series (div-series sine-series cosine-series))

(dump-stream tangent-series 10); 0, 1, 0, 1/3, 0, 2/15, 0, 17/315, 0, 62/2835, done