interval의 각각의 부호에 따르면 총 16가지가 나온다.
하지만 interval의 lower보다 upper가 작은 가지수를 제외하면 총 9가지가 나온다.
각각을 양수 음수로 놓고 표를 만들면 다음과 같다.
따라서 이를 다시 함수로 정의하면 다음과 같다.

하지만 interval의 lower보다 upper가 작은 가지수를 제외하면 총 9가지가 나온다.
각각을 양수 음수로 놓고 표를 만들면 다음과 같다.
(lower x) (upper x) (lower y) (upper y)
+ + + + : lx.ly . ux.uy
+ + + - : 불가
+ + - + : ux.ly . ux,uy
+ + - - : ux,ly . lx,uy
+ - + + : 불가
+ - + - : 불가
+ - - + : 불가
+ - - - : 불가
- + + + : lx,ly . ux,uy
- + + - : 불가
- + - + : ??
- + - - : ux,ly . lx,ly
- - + + : lx,uy . ux,ly
- - + - : 불가
- - - + : lx,uy . ux,ly
- - - - : lx,ly . ux,uy
따라서 이를 다시 함수로 정의하면 다음과 같다.
(define (sub-interval x y)
(let ((lx (lower-bound x))
(ly (lower-bound y))
(ux (upper-bound x))
(uy (upper-bound y)))
(cond ((and (> lx 0) (> ux 0) (> ly 0) (> uy 0)) (make-interval (* lx ly) (* ux uy)))
((and (> lx 0) (> ux 0) (< ly 0) (> uy 0)) (make-interval (* ux ly) (* ux uy)))
((and (> lx 0) (> ux 0) (< ly 0) (< uy 0)) (make-interval (* ux ly) (* lx uy)))
((and (< lx 0) (> ux 0) (> ly 0) (> uy 0)) (make-interval (* lx ly) (* ux uy)))
((and (< lx 0) (> ux 0) (< ly 0) (< uy 0)) (make-interval (* ux ly) (* lx ly)))
((and (< lx 0) (< ux 0) (> ly 0) (> uy 0)) (make-interval (* lx uy) (* ux ly)))
((and (< lx 0) (< ux 0) (> ly 0) (< uy 0)) (make-interval (* lx uy) (* ux ly)))
((and (< lx 0) (< ux 0) (< ly 0) (< uy 0)) (make-interval (* lx ly) (* ux uy)))
(else
(let
((p1 (* lx ly))
(p2 (* lx uy))
(p3 (* ux ly))
(p4 (* ux uy)))
(make-interval
(min p1 p2 p3 p4)
(max p1 p2 p3 p4)))))))

댓글 없음:
댓글 쓰기