2013年5月5日日曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション)の1(手続きによる抽象の構築)、1.3(高階手続きによる抽象)、1.3.1(引数としての手続き)の問1.29、問1.30を解いてみる。

その他参考書籍

問題 1.29.

コード

sample.scm

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

(define (integral f a b dx)
  (define (add-dx x) (+ x dx))
  (* (sum f (+ a (/ dx 2.0)) add-dx b)
     dx))

(define (simpson-integral f a b n)
  (define h (/ (- b a) n))
  (define (next x) (+ x 2))
  (define (y k) (f (+ a (* k h))))
    (if (even? n)
        (* (+ (y 0)
              (* 4 (sum y 1 next (- n 1)))
              (* 2 (sum y 2 next (- n 2)))
              (y n))
           (/ h 3.0))
        (else #f)))

(define (cube x)
  (* x x x))

入出力結果(Terminal, REPL(Read, Eval, Print, Loop))

1 ]=> (integral cube 0 1 0.01)

;Value: .24998750000000042

1 ]=> (integral cube 0 1 0.001)

;Value: .249999875000001

1 ]=> (simpson-integral cube 0 1 100)

;Value: .25

1 ]=> (simpson-integral cube 0 1 1000)

;Value: .25

1 ]=> ^D
End of input stream reached.
Moriturus te saluto.

シンプソンの公式を使ったら、出力結果では誤差が無くなった。

問1.30.

コード

sample.scm

; 反復的に実行できるように修正
(define (sum term a next b)
  (define (iter a result)
    (if (> a b)
        result
        (iter (next a) (+ result (term a)))))
  (iter a 0))

; 元のsumと結果が同じになるか確認
(define (inc n) (+ n 1))

(define (sum-cubes a b)
  (sum cube a inc b))

(define (identity x) x)

(define (sum-integers a b)
  (sum identity a inc b))

(define (integral f a b dx)
  (define (add-dx x) (+ x dx))
  (* (sum f (+ a (/ dx 2.0)) add-dx b)
     dx))

(define (simpson-integral f a b n)
  (define h (/ (- b a) n))
  (define (next x) (+ x 2))
  (define (y k) (f (+ a (* k h))))
    (if (even? n)
        (* (+ (y 0)
              (* 4 (sum y 1 next (- n 1)))
              (* 2 (sum y 2 next (- n 2)))
              (y n))
           (/ h 3.0))
        (else #f)))

(define (cube x)
  (* x x x))

入出力結果(Terminal, REPL(Read, Eval, Print, Loop))

1 ]=> (sum-cubes 1 10)

;Value: 3025

1 ]=> (sum-integers 1 10)

;Value: 55

1 ]=> (integral cube 0 1 0.01)

;Value: .24998750000000042

1 ]=> (integral cube 0 1 0.001)

;Value: .24999987500000073

1 ]=> (simpson-integral cube 0 1 100)

;Value: .25

1 ]=> (simpson-integral cube 0 1 1000)

;Value: .25

1 ]=> ^D
End of input stream reached.
Moriturus te saluto.

0 コメント:

コメントを投稿