2015年2月16日月曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の1(手続きによる抽象の構築)、1.3(高階手続きによる抽象)、1.3.1(引数としての手続き)、問題 1.29.を解いてみる。

その他参考書籍

問題 1.29.

コード(BBEdit, Emacs)

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

(define cube
  (lambda (x) (* x x x)))

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

(define integral-simple
  (lambda (f a b dx)
    (* (sum f (+ a (/ dx 2.0)) (lambda (x) (+ x dx)) b)
       dx)))

(define integral-simpson
  (lambda (f a b n)
    ((lambda (h)
       (* (/ h 3)
          (+ (f a)
             (* 4
                (sum f
                     (+ a h)
                     (lambda (x) (+ x (* 2 h)))
                     (+ a (* (- n 1) h))))
             (* 2
                (sum f
                     (+ a (* 2 h))
                     (lambda (x) (+ x (* 2 h)))
                     (+ a (* (- n 2) h))))
             (f (+ a (* n h))))))
     (/ (- b a) n))))

(define integral-simpson-f
  (lambda (f a b n)
    ((lambda (h)
       (* (/ h 3.0)
          (+ (f a)
             (* 4
                (sum f
                     (+ a h)
                     (lambda (x) (+ x (* 2 h)))
                     (+ a (* (- n 1) h))))
             (* 2
                (sum f
                     (+ a (* 2 h))
                     (lambda (x) (+ x (* 2 h)))
                     (+ a (* (- n 2) h))))
             (f (+ a (* n h))))))
     (/ (- b a) n))))

(for-each
 (lambda (n)
   (print "integral        : " (integral-simple cube 0 1 0.01))
   (print "n: " n)
   (print "integral-simpson-f: " (integral-simpson-f cube 0 1 n))
   (print "integral-simpson: " (integral-simpson cube 0 1 n)))
 (list 100 1000))

入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))

$ ./sample29.scm
integral        : 0.24998750000000042
n: 100
integral-simpson-f: 0.25
integral-simpson: 1/4
integral        : 0.24998750000000042
n: 1000
integral-simpson-f: 0.25
integral-simpson: 1/4
$

0 コメント:

コメントを投稿