Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
122 lines (95 sloc) 4.46 KB

2.14

先举几个例子看看:

(load "2.12.scm")
(define (par1 r1 r2)
  (div-interval (mul-interval r1 r2)
                (add-interval r1 r2)))
 
(define (par2 r1 r2)
  (let ((one (make-interval 1 1)))
    (div-interval one
                  (add-interval (div-interval one r1)
                                (div-interval one r2)))))

(define R1 (make-center-percent 50000 .001))
(define R2 (make-center-percent 80000 .001))

(center (par1 R1 R2))
;Value: 30769.353846276925
(percent (par1 R1 R2))
;Value: 2.9999920000239916e-3
(center (par2 R1 R2))
;Value: 30769.230769230766
(percent (par2 R1 R2))
;Value: 1.0000000000000501e-3

通过上面的例子可以看出,Lem的抱怨是对的,中心与误差都不一样。

下面求A/AA/B的值:

(load "2.12.scm")
(define A (make-center-percent 50000 .001))
(define B (make-center-percent 80000 .001))

(div-interval A A)
;Value: (.998001998001998 . 1.002002002002002)
(center (div-interval A A))
;Value: 1.000002000002
(percent (div-interval A A))
;Value: 1.999998000001999e-3

(div-interval A B)
;Value: (.6237512487512488 . .6262512512512513)
(center (div-interval A B))
;Value: .6250012500012501
(percent (div-interval A B))
;Value: 1.999998000001988e-3

通过上面的例子可以看出:

区间A/A的结果不是1。

2.15

题目说:

如果一个公式可以写成另一种形式,其中具有非准确性的变量不重复出现,那么这个公式是更准确的。

在上面的习题2.14中,par1中R1与R2各出现了两次,因为R1与R2的值都是不确定的,多次引用的话肯定会使最终的结果误差较大。比如:

R1的区间范围为[2,4],那么R1第一次取值可能为2.5,第二次取值可能为3.5。 这在实际中是不可能的,虽然R1的值是不确定的,但是只要R1的值定下来了,后面引用多少次都是一样的。

而在par2中,R1与R2各引用了一次所以误差更小。

2.16

这题让我们解释下面两个问题:

  1. 为什么等值的代数式可能导致不同的计算结果?
  2. 你能设计出一个区间算术包,使之没有这种缺陷吗?或者说这件事根本不可能做到?

对于问题1,我们可以举一个分配律的例子:

a(b+c) = ab+ac

(load "2.12.scm")
(define a (make-interval 2 4))
(define b (make-interval -2 0))
(define c (make-interval 3 8))
(define x (mul-interval a
                        (add-interval b c)))
 
(define y (add-interval (mul-interval a b)
                        (mul-interval a c)))
x
;Value: (2 . 32)
y
;Value: (-2 . 32)

可以看到:x不等于y。 还有一些基本的算数运算也是不正确的,像A*A/A不等于A

(div-interval (mul-interval a a) a)
;(1. . 8.)
a
;(2 . 4)

可以看到,由于不确定的值a用了多次后,结果的误差更大了。这和习题2.15是所说的是相符的。

对于问题2,到底能不能设计出一种能够避免上面的区间运算包,我觉得只要能够去掉不确定性值的不确定性就可以了。 我们可以实现一个identity函数,在使用某个区间前先判断其是否与之前使用过的区间相等,如果相等,直接取上次的结果就可以了。

在下面给出的参考链接3中,发现我这个想法是不可能的,wiki上称之为Dependency_problem

The so-called dependency problem is a major obstacle to the application of interval arithmetic. Although interval methods can determine the range of elementary arithmetic operations and functions very accurately, this is not always true with more complicated functions. If an interval occurs several times in a calculation using parameters, and each occurrence is taken independently then this can lead to an unwanted expansion of the resulting intervals.

...

In general, it can be shown that the exact range of values can be achieved, if each variable appears only once. However, not every function can be rewritten this way.

区间运算问题也很有名,下面给出几个链接,后面有机会再深入了解:

参考