(load "util.scm") (define (integral integrand initial-value dt) (define int (cons-stream initial-value (add-streams (scale-stream integrand dt) int))) int) (display "\nex-3.73 - RC\n") (define (RC R C dt) (define (rc-proc i v0) (add-streams (scale-stream i R) (integral (scale-stream i (/ 1 C)) v0 dt))) rc-proc) (define RC1 (RC 5 1 0.5)) (assert (take 5 (RC1 ones 4.2)) '(9.2 9.7 10.2 10.7 11.2)) (display "\nex-3.74 - zero-crossings\n") (define sense-data (list->stream '(1 2 1.5 1 0.5 -0.1 -2 -3 -2 -0.5 0.2 3 4))) (define response '(0 0 0 0 0 -1 0 0 0 0 1 0)) (define (sign-change-detector s2 s1) (cond ((and (< s1 0) (>= s2 0)) 1) ((and (>= s1 0) (< s2 0)) -1) (else 0))) (define (make-zero-crossings input-stream last-value) (cons-stream (sign-change-detector (stream-car input-stream) last-value) (make-zero-crossings (stream-cdr input-stream) (stream-car input-stream)))) (define zero-crossings (make-zero-crossings sense-data 0)) (assert (take 12 zero-crossings) response) (define zero-crossings (stream-map sign-change-detector sense-data (cons-stream 0 sense-data))) (assert (take 12 zero-crossings) response) (display "\nex-3.75 - averaged zero-crossings\n") ; Louis' solution uses the average value as last-value which means that the new ; value and the previous average are used for averaging and not simply two ; consecutive values as proposed by Alyssa. (define (make-zero-crossings-avg input-stream last-value last-avpt) (let ((avpt (/ (+ (stream-car input-stream) last-value) 2))) (cons-stream (sign-change-detector avpt last-avpt) (make-zero-crossings-avg (stream-cdr input-stream) (stream-car input-stream) avpt)))) (display (take 12 (make-zero-crossings-avg sense-data 0 0))) (newline) (display "\nex-3.76 - smooth zero-crossings\n") (define (smooth xs) (stream-map average xs (stream-cdr xs))) (define (make-zero-crossings-smoothed input-stream last-value) (make-zero-crossings (smooth input-stream) last-value)) (assert (take 11 (make-zero-crossings-smoothed sense-data 0)) '(0 0 0 0 0 -1 0 0 0 0 1)) (display "\nex-3.77\n") ;(display "\nex-3.78\n") ;(display "\nex-3.79\n") ;(display "\nex-3.80\n") ;(display "\nex-3.81\n") ;(display "\nex-3.82\n")