为什么 (R1*R2)/(R1 + R2) 与 1/(1/R1+1/R2)求得的值不同。
(define (par1 r1 r2) (div-interval (mul-interval r1 r2) (add-interval r1 r2))) (define (par1 r1 r2) (let ((one (make-interval 1 1))) (div-interval one (add-interval (div-interval one r1) (div-interval one r2)))))
比如 r1为 [1,2] r2 为 [3,4]
r1*r2为[3,8] 最小值时r1取1,r2取 3, 最大值时r1取 2,r2取 4
r1 + r2为 [4,6] 最小值时r1取1,r2取3,最大值时r1取2,r2取4
r1*r2/(r1+r2)得出[1/2, 2] 最小值时 r1*r2取最小值,r1+r2取最大值,得出r1,取最小值又取最大值,r2取最小值又取最大值,所以这种求法是错误的。
正确的求值方法如下
(define (make-interval l u) (cons l u)) (define (lower-bound i) (car i)) (define (upper-bound i) (cdr i)) (define (f op) (lambda (x y) (let ((p1 (op (lower-bound x) (lower-bound y))) (p2 (op (lower-bound x) (upper-bound y))) (p3 (op (upper-bound x) (lower-bound y))) (p4 (op (upper-bound x) (upper-bound y)))) (make-interval (min p1 p2 p3 p4) (max p1 p2 p3 p4))))) (define add-interval (f +)) (define sub-interval (f -)) (define mul-interval (f *)) (define div-interval (f /)) (define par1 (f (lambda (x y) (/ (* x y) (+ x y))))) (define par2 (f (lambda (x y) (/ 1 (+ (/ 1 x) (/ 1 y))))))