2014年3月15日土曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の2(データによる抽象の構築)、2.1(データ抽象入門)、2.1.4(拡張問題: 区間算術演算)、問題 2.13.を解いてみる。

その他参考書籍

問題 2.13.

全ての数が正と仮定する。

区間x、yのパーセント許容誤差が十分小さいと仮定、すなわち

(* (/ p1 100) (/ p2 100))
としたときの、区間xの最小値。
(- c1 (* c1 (/ p1 100)))
区間xの最大値。
(+ c1 (* c1 (/ p1 100)))
区間yの最小値。
(- c2 (* c2 (/ p2 100)))
区間yの最大値。
(+ c2 (* c2 (/ p2 100)))
区間x、yの積。
(make-interval (* (lower-bound x)
                  (lower-bound y))
               (* (upper-bound x)
                  (upper-bound y)))

(make-interval (* (- c1 (* c1 (/ p1 100)))
                  (- c2 (* c2 (/ p2 100))))
               (* (+ c1 (* c1 (/ p1 100)))
                  (+ c2 (* c2 (/ p2 100)))))

(make-interval (- (* c1 c2)
                  (+ (/ (* c1 c2 p2) 100)
                     (/ (* c1 c2 p1) 100)))
               (+ (* c1 c2)
                  (/ (* c1 c2 p2) 100)
                  (/ (* c1 c2 p1) 100)))

(make-interval (- (* c1 c2)
                  (/ (* c1 c2 (+ p1 p2))
                     100))
               (+ (* c1 c2)
                  (/ (* c1 c2 (+ p1 p2))
                     100)))
区間x、yの積の中央値。
(/ (+ (*c1 c2) (* c1 c2)) 2)

(* c1 c2)
区間x、yの積の区間のパーセント相対許容誤差。
(* 100 (/ (- (+ (* c1 c2)
                (/ (* c1 c2 (+ p1 p2))
                   100))
             (* c1 c2))
          (* c1 c2)))

(* 100 (/ (- (+ 1 (/ (+ p1 p2) 100))
             1)
          1))

(+ p1 p2)

よって、パーセント教養後さが小さいと仮定できるときは、二つの区間の関野相対許容誤差を、因子の許容誤差の和として近似することができる。

確認。

コード(BBEdit, Emacs)

sample.scm

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

;; これまでに書いた手続き
(load "./procedures.scm")

;; 構成子
;; 区間の中央値とパーセント相対許容誤差
(define (make-center-percent c p)
  ((lambda (x)
     (make-interval (- c x)
                    (+ c x)))
   (* (abs c)
      (/ p 100))))

;; 選択子
;; パーセント相対許容誤差
(define (percent i)
  ((lambda (c)
     (abs (* 100
             (/ (- (upper-bound i)
                   c)
                c))))
   (center i)))

(define interval1 (make-center-percent 10 0.5))
(define interval2 (make-center-percent 100 0.05))
(define interval12 (mul-interval interval1 interval2))

(print (+ 0.5 0.05))
(print (percent interval12))

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

$ ./sample.scm
0.55
0.5499986250034374
$

0 コメント:

コメントを投稿