開発環境
- 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.30.を解いてみる。
その他参考書籍
- Instructor's Manual to Accompany Structure & Interpretation of Computer Programs
- プログラミングGauche (Kahuaプロジェクト (著), 川合 史朗 (監修), オライリージャパン)
問題 1.30.
コード(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)
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ result (term a)))))
(iter a 0))
(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.24999987500000073 誤差: 1.249999992680717e-7 Simpson's rule n = 100 0.25 誤差: 0.0 n = 1000 0.25000000000000006 誤差: 5.551115123125783e-17 $
0 コメント:
コメントを投稿