開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Scheme (プログラミング言語)
- Gauche (処理系)
計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の1(手続きによる抽象の構築)、1.3(高階手続きによる抽象)、1.3.1(引数としての手続き)、問題 1.29.を解いてみる。
その他参考書籍
- Instructor's Manual to Accompany Structure & Interpretation of Computer Programs
- プログラミングGauche (Kahuaプロジェクト (著), 川合 史朗 (監修), オライリージャパン)
問題 1.29.
コード(BBEdit, Emacs)
sample.scm
#!/usr/bin/env gosh ;; -*- coding: utf-8 -*- (define (cube x) (* x (square x))) (define (inc n) (+ n 1)) (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)) ;; simpsonの公式 (define (simpson-rule f a b n) (define h (/ (- b a) n)) (define (y k) (f (+ a (* k h)))) (define (term k) (cond ((= k 0) (y 0)) ((= k n) (y n)) ((even? k) (* 2.0 (y k))) (else (* 4.0 (y k))))) (* (/ h 3) (sum term 0 inc n))) ;; (define (square x) (* x x)) ;; 結果を比較 (define n 0.25) (print "integral") (define a (integral cube 0 1 0.001)) (print a) (print "誤差: " (abs (- n a))) (print "Simpson's rule") (print "n = " 100) (define b (simpson-rule cube 0 1 100)) (print b) (print "誤差: " (abs (- n b))) (print "n = " 1000) (define c (simpson-rule cube 0 1 1000)) (print c) (print "誤差: " (abs (- n c)))
入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))
$ ./sample.scm integral 0.249999875000001 誤差: 1.2499999899051595e-7 Simpson's rule n = 100 0.24999999999999992 誤差: 8.326672684688674e-17 n = 1000 0.2500000000000002 誤差: 2.220446049250313e-16 $
0 コメント:
コメントを投稿