開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: MIT/GNU Scheme
計算機プログラムの構造と解釈(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 コメント:
コメントを投稿