2014年2月13日木曜日

開発環境

計算機プログラムの構造と解釈(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.を解いてみる。

その他参考書籍

問題 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 コメント:

コメントを投稿