SICP 読み (17)

早く 2.2 節に取りかかりたい、と思いつつ我慢。

問題 2.12

追加した手続きを以下に。

(define (make-center-width c w)
  (make-interval (- c w) (+ c w)))

(define (center i)
  (/ (+ (lower-bound i) (upper-bound i)) 2))

(define (width i)
  (/ (- (upper-bound i) (lower-bound i)) 2))

(define (make-center-percent c p)
  (make-interval (- c (* c (/ p 100)))
		 (+ c (* c (/ p 100)))))

(define (percent i)
  (* 100 (/ (- (upper-bound i) (center i)) (center i))))

100 を掛けたり割ったりで微妙。試験は略で。

問題 2.13

色々な値を使って試してみた。

(define i1 (make-center-percent 5 0.1))
(define i2 (make-center-percent 10 0.2))
(define i3 (make-center-percent 50 0.01))
(define i4 (make-center-percent 20 0.03))
(define i5 (make-center-percent 30 10))
(define i6 (make-center-percent 20 5))

適当かどうかは不明ですが、とりあえず上記を使用。まず、i1 と i2 を。

gosh> (mul-interval i1 i2)
(49.850100000000005 . 50.150099999999995)
gosh> (percent i1)
0.09999999999999788
gosh> (percent i2)
0.19999999999999576
gosh> (* (center i1) (center i2))
50.0
gosh> i1
(4.995 . 5.005)
gosh> i2
(9.98 . 10.02)
gosh> (* (lower-bound i1) (lower-bound i2))
49.850100000000005
gosh> (/ 0.15 50)
0.003
gosh> 

むむ。i1 は 0.1% で i2 は 0.2% が許容誤差。i1 と i2 を掛けた下限が 49.85 として、差分は 0.15 で積の center とのナニは 0.003。i1 の誤差と i2 の誤差を加えた値がパーセント相対許容誤差と見てよいのかな。
これを前提に i3 と i4 で試験してみる。

gosh> i3
(49.995 . 50.005)
gosh> i4
(19.994 . 20.006)
gosh> (percent i3)
0.010000000000005116
gosh> (percent i4)
0.030000000000001137
gosh> (+ (percent i3) (percent i4))
0.04000000000000625
gosh> (* (center i3) (center i4) (/ (+ (percent i3) (percent i4)) 100))
0.40000000000006253
gosh> (mul-interval i3 i4)
(999.60003 . 1000.40003)
gosh>

なかなか良い数値に見えるんですが駄目??
次は大きい誤差で試験。

gosh> i5
(27.0 . 33.0)
gosh> i6
(19.0 . 21.0)
gosh> (percent i5)
10.0
gosh> (percent i6)
5.0
gosh> (+ (percent i5) (percent i6))
15.0
gosh> (* (center i5) (center i6) (/ (+ (percent i5) (percent i6)) 100))
90.0
gosh> (mul-interval i5 i6)
(513.0 . 693.0)
gosh> 

を、大きい誤差だと数字が合わなくなってるかも。90 ではなくて 87 と 93 になっているのか??

で、結論としては

二つの区間の積の相対許容誤差 = 二つの区間の相対許容誤差の和

で良いのかなぁ。(微妙

追記

ちなみに上記の結論は、相対許容誤差が小さい時限定、とゆー事で。