timothy235

sicp-3-5-4-streams-and-delayed-evaluation

Mar 8th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 2.80 KB | None | 0 0
  1. #lang racket
  2. (require "3-5-streams.rkt")
  3.  
  4. ;; We use the Racket built-in force and delay with the book stream implementation.
  5. ;; (delay e) produces a 'promise'.  (delay e) does not evaluate e.
  6. ;; (force (delay e)) evaluates e and caches its value.
  7.  
  8. ;; For example:
  9.  
  10. (define prms
  11.   (delay (begin (displayln 'hello)
  12.                 (* 2 3))))
  13. prms
  14. ;; #<promise:prms>
  15. (force prms)
  16. ;; hello
  17. ;; 6
  18. (force prms) ; subsequent force's return the cached value
  19. ;; 6
  20.  
  21. ;;;;;;;;;;
  22. ;; 3.77 ;;
  23. ;;;;;;;;;;
  24.  
  25. (define (integral delayed-integrand initial-value dt)
  26.   (cons-stream initial-value
  27.                (let ([integrand (force delayed-integrand)])
  28.                  (if (stream-null? integrand)
  29.                    the-empty-stream
  30.                    (integral (delay (stream-cdr integrand))
  31.                              (+ (* dt (stream-car integrand))
  32.                                 initial-value)
  33.                              dt)))))
  34.  
  35. (define (solve f y0 dt)
  36.   (define y (integral (delay dy) y0 dt))
  37.   (define dy (my-stream-map f y))
  38.   y)
  39.  
  40. (my-stream-ref (solve (lambda (y) y) 1 0.001) 1000)
  41. ;; 2.716923932235896
  42.  
  43. ;;;;;;;;;;
  44. ;; 3.78 ;;
  45. ;;;;;;;;;;
  46.  
  47. (define (solve-2nd a b dt y0 dy0)
  48.   (define y (integral (delay dy) y0 dt))
  49.   (define dy (integral (delay ddy) dy0 dt))
  50.   (define ddy (add-streams (scale-stream dy a)
  51.                            (scale-stream y b)))
  52.   y)
  53.  
  54. ;; y'' - 2 * y' + y = 0 with y(0) = 1 and y'(0) = 1
  55. ;; has solution y = e ^ t so y(1) = e
  56.  
  57. (exp 1)
  58. ;; 2.718281828459045
  59.  
  60. (my-stream-ref (solve-2nd 2 -1 0.001 1 1) 1000)
  61. ;; 2.716923932235896
  62.  
  63. ;;;;;;;;;;
  64. ;; 3.79 ;;
  65. ;;;;;;;;;;
  66.  
  67. (define (generalized-solve-2nd f dt y0 dy0)
  68.   (define y (integral (delay dy) y0 dt))
  69.   (define dy (integral (delay ddy) dy0 dt))
  70.   (define ddy (my-stream-map f dy y))
  71.   y)
  72.  
  73. ;; Same example as above:
  74.  
  75. (my-stream-ref (generalized-solve-2nd (lambda (u v) (+ (* 2 u) (- v)))
  76.                                       0.001
  77.                                       1
  78.                                       1)
  79.                1000)
  80. ;; 2.716923932235896
  81.  
  82. ;;;;;;;;;;
  83. ;; 3.80 ;;
  84. ;;;;;;;;;;
  85.  
  86. (define (RLC R L C dt)
  87.   (lambda (vC0 iL0)
  88.     (define vC
  89.       (integral (delay (scale-stream iL (/ -1.0 C)))
  90.                 vC0
  91.                 dt))
  92.     (define iL
  93.       (integral (delay (add-streams (scale-stream vC (/ 1.0 L))
  94.                                     (scale-stream iL (/ (* -1.0 R) L))))
  95.                 iL0
  96.                 dt))
  97.     (my-stream-map cons vC iL)))
  98.  
  99. (display-this-many 10 ((RLC 1 1 0.2 0.1) 10 0) 'vert)
  100. ;; (10 . 0)
  101. ;; (10 . 1.0)
  102. ;; (9.5 . 1.9)
  103. ;; (8.55 . 2.66)
  104. ;; (7.220000000000001 . 3.249)
  105. ;; (5.5955 . 3.6461)
  106. ;; (3.77245 . 3.84104)
  107. ;; (1.8519299999999999 . 3.834181)
  108. ;; (-0.0651605000000004 . 3.6359559)
  109. ;; (-1.8831384500000004 . 3.2658442599999997)
  110. ;; 'done
Add Comment
Please, Sign In to add comment