-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2.13.rkt
55 lines (53 loc) · 1.42 KB
/
2.13.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#lang scheme
; 预定义函数
(define (make-interval a b) (cons a b))
(define (lower-bound z)
(min (car z)
(cdr z)))
(define (upper-bound z)
(max (car z)
(cdr z)))
(define (center i)
(/ (+ (lower-bound i) (upper-bound i)) 2))
(define (width i)
(/ (- (upper-bound i) (lower-bound i)) 2))
(define (make-center-percent c p)
(let ((w (* c p)))
(make-interval (- c w) (+ c w))))
(define (percent i)
(/ (width i) (center i)))
(define (mul-interval x y)
(let ((p1 (* (lower-bound x) (lower-bound y)))
(p2 (* (lower-bound x) (upper-bound y)))
(p3 (* (upper-bound x) (lower-bound y)))
(p4 (* (upper-bound x) (upper-bound y))))
(make-interval (min p1 p2 p3 p4)
(max p1 p2 p3 p4))))
; 使用 make-center-percent 的方式表示 interval,
; 并假定全部是正数,则可以有:
; X = (x, p)
; Y = (y, q)
; Z = (z, r) = A * B, and
; w is width of Z, c is center of Z.
;
; 则:
; r = w / c
; w = (Zmax - Zmin) / 2
; c = (Zmax + Zmin) / 2
; Zmax = (x+x*p)*(y+y*q) = xy(1+p+q+pq)
; Zmin = (x-x*p)*(y-y*q) = xy(1-p-q+pq)
;
; ==>
; w = (xy(1+p+q+pq)-xy(1-p-q+pq))/2 = xy(2p+2q)/2 = xy(p+q)
; c = (xy(1+p+q+pq)+xy(1-p-q+pq))/2 = xy(2+2pq)/2 = xy(1+pq)
;
; ==>
; r = (xy(p+q))/(xy(1+pq)) = (p+q)/(1+pq)
; 测试
(define p 0.2)
(define q 0.3)
(define X (make-center-percent 5 p))
(define Y (make-center-percent 7 q))
(define Z (mul-interval X Y))
(percent Z)
(/ (+ p q) (+ 1 (* p q)))