Arantium Maestum

プログラミング、囲碁、読書の話題

SICPの勉強 問題1.38~39

SICP1.3.3の問題1.38と1.39を解いてみる。

1.38問はネイピア数から2引いた数を近似するもの。

1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, ...というめんどくさい数列をdの関数としてcont-fracに入れる。

(defn d [x]
  (if (= 2 (rem x 3))
    (* 2 (inc (quot x 3)))
    1))

(cont-frac (constantly 1.0) d 10)

結果は0.7182817182817183で、ネイピア数2.718281828459...から2引いた数にかなり近いのが見て取れる。

1.39はタンジェントの近似。

一番外側の分子が他のレベルと非対称になっているのがちょっと頭の使いどころか。解決策はただ単に、cont-fracでは対称にしておいて、その後全体を割り算で修正するだけなんだけど。

(defn odd [x] (dec (* 2 x)))

(defn tan-cf [x k]
  (/ (cont-frac (constantly (* -1 x x)) odd k)
     (* -1 x)))

こんな感じで走らせてみる:

(tan-cf 0.5 10)

結果は0.5463024898437905(Math/tan 0.5)と完全に一致する。