問題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

それぞれ中央値C_{1},C_{2}、中央値と幅の割合(相対許容誤差。以下単に誤差と書いたりする)をp_{1},p_{2}区間(C_{1}\pm p_{1}C_{1})(C_{2}\pm p_{2}C_{2})の積を考える。(ただし、題意よりそれぞれの区間の上限、下限は正数であるとする)
上限、下限ともに正数なので、積区間の上限、下限はそれぞれ
sup=C_{1}C_{2}(1+p_{1}+p_{2}+p_{1}p_{2})
inf=C_{1}C_{2}(1-p_{1}-p_{2}+p_{1}p_{2})
となり、
center=\frac{sup + inf}{2}
=C_{1}C_{2}(1+p_{1}p_{2})
width=\frac{sup-inf}{2}
=C_{1}C_{2}(p_{1}+p_{2})
となる。
percent=\frac{width}{center}
=\frac{p_{1}+p_{2}}{1+p_{1}p_{2}}
p_{1},p_{2}が十分小さければp_{1}p_{2}は無視できるので(やや自信なし)
\simeq p_{1}+p_{2}
つまり、区間の乗算において乗数の誤差が十分小さい場合、積の誤差は乗数同士の誤差の和に近似できる。(驚くべきことに区間の中央値には依存しない。)

(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

10%誤差の区間と5%誤差の区間の積は、概ね15%ほどになる。

2.14 2.15

乗算と同じように加算の誤差がどうなるか調べると、2つの区間の加重平均みたいな値になる(例えば10.0\pm5%10\pm15%の和は20\pm10%になり、誤差は加重平均的な値の10%になる。)

次に除算について、以下の命題を証明する。ただし、以下で「逆数」とは、除算の定義につかった、「区間の上限と下限の逆数を下限、上限とする区間」のことである。

命題:区間逆数の誤差は元の区間の誤差と等しい

証明:区間(l, u)の誤差は\frac{u-l}{u+l}
区間(l, u)逆数(1/u, 1/l)
center=\frac{1/l+1/u}{2}
width=\frac{1/l-1/u}{2}
percent=\frac{1/l-1/u}{1/l+1/u}
=\frac{u-l}{u+l}
となり、これは元の誤差と等しい。


以上より、抵抗R_{1},R_{2}の誤差をそれぞれp_{1},p_{2}とし、加重平均をp_{ave}とすると、\frac{R_{1}R_{2}}{R_{1}+R_{2}}で合成抵抗を求めた際の結果の誤差はp_{1}+p_{2}+p_{ave}となる。
一方、\frac{1}{1/R_{1} + 1/R_{2}}で求めた場合の結果の誤差はp_{ave}となり、後者の方が明らかに精度が良い。

2.16

ほとんど無理じゃね?
一応、式自体の誤差がどうなるかは上でやったようなやり方で評価できるので、なんか代数的な等価変換をランダムに起こすようにして、遺伝的アルゴリズムで最適な式を見つけるとかは不可能じゃないかもしんないけど限りなく才能の無駄遣いに思える。