summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Vink <mike1994vink@gmail.com>2023-03-07 15:18:30 +0100
committerMike Vink <mike1994vink@gmail.com>2023-03-07 15:18:30 +0100
commitbd5f50be83a10363fdfd4f73a377325cf48b5903 (patch)
tree050f562d4b815cc4a8467facb935c0cba98b8bea
parent592ef89cb282ab33d6b10cacae711a4a8e6b1212 (diff)
fixup
-rw-r--r--coding-exercises/2/10.rkt5
-rw-r--r--coding-exercises/2/11.rkt90
-rw-r--r--coding-exercises/2/12.rkt29
-rw-r--r--coding-exercises/2/13.rkt10
-rw-r--r--coding-exercises/2/14.rkt66
-rw-r--r--coding-exercises/2/7.rkt8
-rw-r--r--coding-exercises/2/8.rkt4
-rw-r--r--coding-exercises/2/9.rkt9
-rw-r--r--shared/intervals.rkt157
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))
+