2014年12月4日木曜日

[SICP] 問題 1.39 : 正弦関数の連分数展開

正接関数の連分数展開は1770年にドイツの数学者 J. H. Lambertが発表した. xをラジアンで表し,
Lambertの式に基づいて正接関数の近似値を計算する手続き(tan-cf x k) を定義せよ. kは問題1.37と同様, 計算する項数を指定する.
問題文の式から手続きを定義します. 分子がx2となる項からcont-fracを使います.
(define (square x) (* x x))

;; 反復的プロセスを生成
(define (cont-frac n d k)
  (define (iter i result)
    (if (= i 0)
        result
        (iter (- i 1)
              (/ (n i)
                 (+ (d i) result)))))
  (iter k 0))

(define (tan-cf x k)
  (/ x
     (+ 1 (cont-frac (lambda (i) (- (square x)))
                     (lambda (i) (+ (* i 2) 1))
                     k))))
tanは定義済みですので, その結果と比較します.
ようこそ DrRacket, バージョン 6.1 [3m].
言語: Pretty Big; memory limit: 2048 MB.
> (tan 1.0)
1.5574077246549023
> (tan-cf 1.0 10)
1.557407724654902
> (tan-cf 1.0 100)
1.557407724654902
> 

0 件のコメント:

コメントを投稿