Added my solutions so far
This commit is contained in:
		
							
								
								
									
										88
									
								
								ex-2.rkt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								ex-2.rkt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
#lang racket
 | 
			
		||||
 | 
			
		||||
(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))))
 | 
			
		||||
 | 
			
		||||
(define (make-interval a b) (cons a b))
 | 
			
		||||
 | 
			
		||||
(define (add-interval a b)
 | 
			
		||||
  (make-interval (+ (lower-bound a) (lower-bound b))
 | 
			
		||||
                 (+ (upper-bound a) (upper-bound b))))
 | 
			
		||||
 | 
			
		||||
;; 2.7
 | 
			
		||||
;; simple definitions.
 | 
			
		||||
(define upper-bound cdr)
 | 
			
		||||
(define lower-bound car)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;; 2.8
 | 
			
		||||
(define (interval-diff f a b)
 | 
			
		||||
  (make-interval (- (lower-bound a) (upper-bound b))
 | 
			
		||||
                 (- (upper-bound a) (lower-bound b))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;; 2.9 this one's just about reasoning, no programming, and I feel too lazy to explain
 | 
			
		||||
;; sorry.
 | 
			
		||||
 | 
			
		||||
;; 2.10 : simple 'nuff.
 | 
			
		||||
(define (div-interval x y)
 | 
			
		||||
  (if (= (lower-bound y) (upper-bound y))
 | 
			
		||||
      (error "WHY? WHY MUST YOU TORTURE ME SO?")
 | 
			
		||||
      (mul-interval
 | 
			
		||||
       x
 | 
			
		||||
       (make-interval (/ 1.0 (upper-bound y))
 | 
			
		||||
                      (/ 1.0 (lower-bound y))))))
 | 
			
		||||
 | 
			
		||||
;; 2.11 : This one's also somewhat simple.
 | 
			
		||||
;; we ONLY need more than two multiplications
 | 
			
		||||
;; if BOTH intervals have different signs on their upper
 | 
			
		||||
;; and lower bounds. otherwise, naive logic works fine.
 | 
			
		||||
 | 
			
		||||
(define (mul-interval2 x y)
 | 
			
		||||
  (define (different? n)
 | 
			
		||||
    (and (< (lower-bound n) 0) (< (upper-bound n) 0)))
 | 
			
		||||
  (if (and (different? x) (different? 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-interval (* (lower-bound x) (lower-bound y))
 | 
			
		||||
                     (* (upper-bound x) (upper-bound y)))))
 | 
			
		||||
 | 
			
		||||
;; 2.12 : simple nuff.
 | 
			
		||||
(define (make-center-width c w)
 | 
			
		||||
  (make-interval (- c w) (+ c w)))
 | 
			
		||||
(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)
 | 
			
		||||
  (make-center-width c (* c (/ p 100))))
 | 
			
		||||
(define (percent i)
 | 
			
		||||
  (* (/ (width i) 2) 100))
 | 
			
		||||
 | 
			
		||||
;; 2.13 & 2.14
 | 
			
		||||
(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 A (make-interval 100 101))
 | 
			
		||||
(define B (make-interval 200 201))
 | 
			
		||||
 | 
			
		||||
(div-interval A A)
 | 
			
		||||
(div-interval (make-interval 1 1) A)
 | 
			
		||||
(div-interval B A)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user