問題2.12〜
問題2.12
(define (make-interval a b) (cons a b)) (define (lower-bound r) (car r)) (define (upper-bound r) (cdr r)) (define (center r) (/ (+ (lower-bound r) (upper-bound r)) 2)) (define (width r) (/ (- (upper-bound r) (lower-bound r)) 2)) (define (make-center-percent c p) (let ((wid (* c (/ p 100)))) (make-interval (- c wid) (+ c wid)))) (define (percent r) (* (/ (width r) (center r)) 100))
割合を百分率で扱うのは数学屋としては気持ち悪い。
問題2.13
それぞれ中央値、中央値と幅の割合(相対許容誤差。以下単に誤差と書いたりする)をの区間との積を考える。(ただし、題意よりそれぞれの区間の上限、下限は正数であるとする)
上限、下限ともに正数なので、積区間の上限、下限はそれぞれ
となり、
となる。
が十分小さければは無視できるので(やや自信なし)
つまり、区間の乗算において乗数の誤差が十分小さい場合、積の誤差は乗数同士の誤差の和に近似できる。(驚くべきことに区間の中央値には依存しない。)
(define (approx-mul a b) (let ((p-a (percent a)) (p-b (percent b))) (make-center-percent (* (center a) (center b)) (+ p-a p-b)))) (define (approx-mul2 a b) (let ((p-a (percent a)) (p-b (percent b))) (make-center-percent (* (center a) (center b) (+ 1 (/ (* p-a p-b) 10000))) (+ p-a p-b)))) (define (approx-mul3 a b) (let ((p-a (percent a)) (p-b (percent b))) (make-center-percent (* (center a) (center b) (+ 1 (/ (* p-a p-b) 10000))) (/ (+ p-a p-b) (+ 1 (/ (* p-a p-b) 10000)))))) (define range-a (make-center-percent 6.8 10)) (define range-b (make-center-percent 10 5)) (define (mul-range a b) (make-interval (* (lower-bound a) (lower-bound b)) (* (upper-bound a) (upper-bound b)))) (percent (approx-mul range-a range-b)) (percent (approx-mul2 range-a range-b)) (percent (approx-mul3 range-a range-b)) (percent (mul-range range-a range-b))
15.0
14.999999999999995
14.92537313432836
14.925373134328352