開発環境
- 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 コメント:
コメントを投稿