为什么 (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))))))
posted on 2011-10-24 21:21  class  阅读(189)  评论(0编辑  收藏  举报