diff options
| author | Mike Vink <mike1994vink@gmail.com> | 2023-03-07 15:18:30 +0100 |
|---|---|---|
| committer | Mike Vink <mike1994vink@gmail.com> | 2023-03-07 15:18:30 +0100 |
| commit | bd5f50be83a10363fdfd4f73a377325cf48b5903 (patch) | |
| tree | 050f562d4b815cc4a8467facb935c0cba98b8bea | |
| parent | 592ef89cb282ab33d6b10cacae711a4a8e6b1212 (diff) | |
fixup
| -rw-r--r-- | coding-exercises/2/10.rkt | 5 | ||||
| -rw-r--r-- | coding-exercises/2/11.rkt | 90 | ||||
| -rw-r--r-- | coding-exercises/2/12.rkt | 29 | ||||
| -rw-r--r-- | coding-exercises/2/13.rkt | 10 | ||||
| -rw-r--r-- | coding-exercises/2/14.rkt | 66 | ||||
| -rw-r--r-- | coding-exercises/2/7.rkt | 8 | ||||
| -rw-r--r-- | coding-exercises/2/8.rkt | 4 | ||||
| -rw-r--r-- | coding-exercises/2/9.rkt | 9 | ||||
| -rw-r--r-- | shared/intervals.rkt | 157 |
9 files changed, 356 insertions, 22 deletions
diff --git a/coding-exercises/2/10.rkt b/coding-exercises/2/10.rkt index 20c70b0..ae68781 100644 --- a/coding-exercises/2/10.rkt +++ b/coding-exercises/2/10.rkt @@ -1,8 +1,5 @@ #lang racket -(require - "7.rkt" - "8.rkt" - "9.rkt") +(require "../../shared/intervals.rkt") (define (div-interval x y) (if (and (< 0 (lower-bound y)) (> 0 (upper-bound y))) diff --git a/coding-exercises/2/11.rkt b/coding-exercises/2/11.rkt new file mode 100644 index 0000000..d81d33a --- /dev/null +++ b/coding-exercises/2/11.rkt @@ -0,0 +1,90 @@ +#lang racket +(require "../../shared/intervals.rkt") + +;; Could be written to use less comparisons with nested cond, but this is more readable. +(define (pos? x) + (> x 0)) +(define (neg? x) + (< x 0)) +(define (mul-interval x y) + (cond + ;; 1. all positive + ((and + (pos? (lower-bound x)) + (pos? (lower-bound y)) + (pos? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval (* (lower-bound x) (lower-bound y)) + (* (upper-bound x) (upper-bound y)))) + ;; 2. one lower-bound neg + ((and + (neg? (lower-bound x)) + (pos? (lower-bound y)) + (pos? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval (* (lower-bound x) (upper-bound y)) + (* (upper-bound x) (upper-bound y)))) + ;; 3. one lower-bound neg + ((and + (pos? (lower-bound x)) + (neg? (lower-bound y)) + (pos? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval (* (upper-bound x) (lower-bound y)) + (* (upper-bound x) (upper-bound y)))) + ;; 4. one interval neg + ((and + (neg? (lower-bound x)) + (pos? (lower-bound y)) + (neg? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval (* (upper-bound x) (upper-bound y)) + (* (lower-bound x) (lower-bound y)))) + ;; 5. one interval neg + ((and + (pos? (lower-bound x)) + (neg? (lower-bound y)) + (pos? (upper-bound x)) + (neg? (upper-bound y))) + (make-interval (* (upper-bound x) (upper-bound y)) + (* (lower-bound x) (lower-bound y)))) + ;; 6. one interval neg, one interval crossing zero + ((and + (neg? (lower-bound x)) + (neg? (lower-bound y)) + (neg? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval (* (upper-bound x) (upper-bound y)) + (* (upper-bound x) (lower-bound y)))) + ;; 7. one interval neg, one interval crossing zero + ((and + (neg? (lower-bound x)) + (neg? (lower-bound y)) + (pos? (upper-bound x)) + (neg? (upper-bound y))) + (make-interval (* (upper-bound x) (upper-bound y)) + (* (upper-bound x) (lower-bound y)))) + ;; 8. all neg + ((and + (neg? (lower-bound x)) + (neg? (lower-bound y)) + (neg? (upper-bound x)) + (neg? (upper-bound y))) + (make-interval (* (lower-bound x) (lower-bound y)) + (* (upper-bound x) (upper-bound y)))) + ;; 9. both crossing zero + ((and + (neg? (lower-bound x)) + (neg? (lower-bound y)) + (pos? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval ((lambda (a b) (if (< a b) a b)) + (* (lower-bound x) (upper-bound y)) + (* (upper-bound x) (lower-bound y))) + ((lambda (a b) (if (> a b) a b)) + (* (upper-bound x) (upper-bound y)) + (* (lower-bound x) (lower-bound y))))))) + +(mul-interval + (make-interval -3 3) + (make-interval -4 4)) diff --git a/coding-exercises/2/12.rkt b/coding-exercises/2/12.rkt new file mode 100644 index 0000000..c977436 --- /dev/null +++ b/coding-exercises/2/12.rkt @@ -0,0 +1,29 @@ +#lang racket +(require "../../shared/intervals.rkt") + +(define (make-center-width c w) + (make-interval (- c w) (+ c w))) + +(define (center i) + (/ (+ (lower-bound i) (upper-bound i)) 2)) + +(define (make-center-percent c p) + (let ((toler (* c (/ p 100.0)))) + ((lambda (a b) + (if (> a b) + (make-interval b a) + (make-interval a b))) + (- c toler) + (+ c toler)))) + +(define (percent i) + (abs (* 100 (/ (width i) (center i))))) + +(define (print) + (define t (make-center-width 10.0 6.1)) + (define tp (make-center-percent -10.0 50.0)) + (print-interval t) + (print-interval tp) + (println (percent t)) + (println (percent tp))) +(print) diff --git a/coding-exercises/2/13.rkt b/coding-exercises/2/13.rkt new file mode 100644 index 0000000..bc4cf09 --- /dev/null +++ b/coding-exercises/2/13.rkt @@ -0,0 +1,10 @@ +#lang racket +(require "../../shared/intervals.rkt") + +(define (print) + (let ((i1 (make-center-percent 12.0 5.0)) + (i2 (make-center-percent 12.0 5.0))) + (print-interval (mul-interval i1 i2)) + (println (percent (mul-interval i1 i2))))) + +(print) diff --git a/coding-exercises/2/14.rkt b/coding-exercises/2/14.rkt new file mode 100644 index 0000000..50d28fc --- /dev/null +++ b/coding-exercises/2/14.rkt @@ -0,0 +1,66 @@ +#lang racket +(require "../../shared/intervals.rkt") + +(define (print-interval-percent i) + (newline) + (display "interval{") + (display (center i)) + (display ",") + (display (percent i)) + (display "}") + (newline)) + +(define (lem1 i1 i2) + (div-interval (mul-interval i1 i2) + (add-interval i1 i2))) + +(define (lem2 i1 i2) + (let ((one (make-center-percent 1.0 0))) + (div-interval + one + (add-interval + (div-interval one i1) + (div-interval one i2))))) + +;; adding scales the heighest percent to the new center +(define (print-add) + (let ((i1 (make-center-percent 100.0 2.0)) + (i2 (make-center-percent 200.0 3.0))) + (newline) + (println "*** add") + (print-interval-percent i1) + (print-interval-percent i2) + (print-interval-percent (add-interval i1 i1)) + (print-interval-percent (add-interval i1 i2)) + (print-interval-percent (sub-interval i1 i1)) + (print-interval-percent (sub-interval i1 i2)))) + +;; multiplication and addition of positive intervals +;; adds percentage from both intervals +(define (print-mul) + (let ((i1 (make-interval 2.0 8.0)) + (i2 (make-interval 2.0 8.0))) + (newline) + (println "*** mul") + (print-interval-percent i1) + (print-interval-percent i2) + (print-interval-percent (div-interval i1 i1)) + (print-interval-percent (div-interval i1 i2)) + (print-interval-percent (mul-interval i1 i1)) + (print-interval-percent (mul-interval i1 i2)))) + +;; There are at least some problems as I understand: +;; 1. Repeated intervals in an equation are dependent on each other +;; 2. Multiplicative identity is undefined and should not be uncertain +(define (print-lem) + (let ((i1 (make-center-percent 100.0 2.0)) + (i2 (make-center-percent 200.0 3.0))) + (newline) + (println "*** lem") + (print-interval-percent i1) + (print-interval-percent i2) + (print-interval-percent (lem1 i1 i2)) + (print-interval-percent (lem2 i1 i2)))) +(print-add) +(print-mul) +(print-lem) diff --git a/coding-exercises/2/7.rkt b/coding-exercises/2/7.rkt index 13f28a6..462a58e 100644 --- a/coding-exercises/2/7.rkt +++ b/coding-exercises/2/7.rkt @@ -1,12 +1,4 @@ #lang racket -(provide - make-interval - upper-bound - lower-bound - add-interval - mul-interval - div-interval - print-interval) (define (add-interval x y) (make-interval (+ (lower-bound x) (lower-bound y)) diff --git a/coding-exercises/2/8.rkt b/coding-exercises/2/8.rkt index 1a205fd..61ea92c 100644 --- a/coding-exercises/2/8.rkt +++ b/coding-exercises/2/8.rkt @@ -1,7 +1,5 @@ #lang racket -(provide - sub-interval) -(require "7.rkt") +(require "../../shared/intervals.rkt") (define (sub-interval x y) (make-interval (- (lower-bound x) (upper-bound y)) diff --git a/coding-exercises/2/9.rkt b/coding-exercises/2/9.rkt index 0525802..e85b77d 100644 --- a/coding-exercises/2/9.rkt +++ b/coding-exercises/2/9.rkt @@ -1,14 +1,9 @@ #lang racket -(provide - width) -(require - "7.rkt" - "8.rkt" - "9.rkt") +(require "../../shared/intervals.rkt") (define (width x) (/ (- (upper-bound x) (lower-bound x)) 2)) - + (define (print-sum) (newline) (println "*** (width SUM) == (SUM width) ***") diff --git a/shared/intervals.rkt b/shared/intervals.rkt new file mode 100644 index 0000000..270be51 --- /dev/null +++ b/shared/intervals.rkt @@ -0,0 +1,157 @@ +#lang racket +(provide + width + make-center-width + center + make-center-percent + percent + pos? + neg? + mul-interval + div-interval + sub-interval + add-interval + make-interval + upper-bound + lower-bound + print-interval) +(define (width x) + (/ (- (upper-bound x) (lower-bound x)) 2)) +(define (make-center-width c w) + (make-interval (- c w) (+ c w))) +(define (center i) + (/ (+ (lower-bound i) (upper-bound i)) 2)) +(define (make-center-percent c p) + (let ((toler (* c (/ p 100.0)))) + ((lambda (a b) + (if (> a b) + (make-interval b a) + (make-interval a b))) + (- c toler) + (+ c toler)))) +(define (percent i) + (let ((w (width i)) + (c (center i))) + ;; (newline) (print c)(println w) + ;; not defined: percent of interval centered at zero + (if + (<= c 0) + 0 + (abs (* 100 (/ w c)))))) +(define (pos? x) + (> x 0)) +(define (neg? x) + (< x 0)) +(define (mul-interval x y) + (cond + ;; 1. all positive + ((and + (pos? (lower-bound x)) + (pos? (lower-bound y)) + (pos? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval (* (lower-bound x) (lower-bound y)) + (* (upper-bound x) (upper-bound y)))) + ;; 2. one lower-bound neg + ((and + (neg? (lower-bound x)) + (pos? (lower-bound y)) + (pos? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval (* (lower-bound x) (upper-bound y)) + (* (upper-bound x) (upper-bound y)))) + ;; 3. one lower-bound neg + ((and + (pos? (lower-bound x)) + (neg? (lower-bound y)) + (pos? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval (* (upper-bound x) (lower-bound y)) + (* (upper-bound x) (upper-bound y)))) + ;; 4. one interval neg + ((and + (neg? (lower-bound x)) + (pos? (lower-bound y)) + (neg? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval (* (upper-bound x) (upper-bound y)) + (* (lower-bound x) (lower-bound y)))) + ;; 5. one interval neg + ((and + (pos? (lower-bound x)) + (neg? (lower-bound y)) + (pos? (upper-bound x)) + (neg? (upper-bound y))) + (make-interval (* (upper-bound x) (upper-bound y)) + (* (lower-bound x) (lower-bound y)))) + ;; 6. one interval neg, one interval crossing zero + ((and + (neg? (lower-bound x)) + (neg? (lower-bound y)) + (neg? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval (* (upper-bound x) (upper-bound y)) + (* (upper-bound x) (lower-bound y)))) + ;; 7. one interval neg, one interval crossing zero + ((and + (neg? (lower-bound x)) + (neg? (lower-bound y)) + (pos? (upper-bound x)) + (neg? (upper-bound y))) + (make-interval (* (upper-bound x) (upper-bound y)) + (* (upper-bound x) (lower-bound y)))) + ;; 8. all neg + ((and + (neg? (lower-bound x)) + (neg? (lower-bound y)) + (neg? (upper-bound x)) + (neg? (upper-bound y))) + (make-interval (* (lower-bound x) (lower-bound y)) + (* (upper-bound x) (upper-bound y)))) + ;; 9. both crossing zero + ((and + (neg? (lower-bound x)) + (neg? (lower-bound y)) + (pos? (upper-bound x)) + (pos? (upper-bound y))) + (make-interval ((lambda (a b) (if (< a b) a b)) + (* (lower-bound x) (upper-bound y)) + (* (upper-bound x) (lower-bound y))) + ((lambda (a b) (if (> a b) a b)) + (* (upper-bound x) (upper-bound y)) + (* (lower-bound x) (lower-bound y))))) + ;; 10. The case where one of the endpoints is neither negative or positive, 0 + (else (mul-interval-min-max x y)))) +(define (mul-interval-min-max 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 (div-interval x y) + (if (and (< 0 (lower-bound y)) (> 0 (upper-bound y))) + (error "Division by interval spanning zero") + (mul-interval + x + (make-interval + (/ 1.0 (upper-bound y)) + (/ 1.0 (lower-bound y)))))) +(define (sub-interval x y) + (make-interval (- (lower-bound x) (upper-bound y)) + (- (upper-bound x) (lower-bound y)))) +(define (add-interval x y) + (make-interval (+ (lower-bound x) (lower-bound y)) + (+ (upper-bound x) (upper-bound y)))) +(define (make-interval a b) (cons a b)) +(define (lower-bound x) (car x)) +(define (upper-bound x) (cdr x)) +(define (print-interval x) + (newline) + (display "interval{") + (display (lower-bound x)) + (display ",") + (display (upper-bound x)) + (display "}") + (newline)) + |
