-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathch3.5.4-suguni.ss
73 lines (62 loc) · 1.97 KB
/
ch3.5.4-suguni.ss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
(define (add-streams s1 s2)
(stream-map + s1 s2))
(define (scale-stream stream factor)
(stream-map (lambda (x) (* x factor)) stream))
(define (integral integrand initial-value dt)
(define int
(cons-stream initial-value
(add-streams (scale-stream integrand dt)
int)))
int)
(define (solve f y0 dt)
(define y (integral dy y0 dt))
(define dy (stream-map f y))
y)
;; -> error, y를 얻을 때 아직 정의되지 않은 dy가 필요하기 때문
(define (integral delayed-integrand initial-value dt)
(define int
(cons-stream initial-value
(let ((integrand (force delayed-integrand)))
(add-streams (scale-stream integrand dt)
int))))
int)
(define (solve f y0 dt)
(define y (integral (delay dy) y0 dt))
(define dy (stream-map f y))
y)
(stream-ref (solve (lambda (y) y) 1 0.001) 1000)
(show-stream (solve (lambda (y) y) 1 0.001))
;; ex 3.77
;; 사실 이해하고 풀었다기 보다는, 위의 패턴 그대로 적용한 거임
(define (integral delayed-integrand initial-value dt)
(cons-stream initial-value
(let ((integrand (force delayed-integrand)))
(if (stream-null? integrand)
the-empty-stream
(integral (delay (stream-cdr integrand))
(+ (* (stream-car integrand) dt)
initial-value)
dt)))))
(define (solve f y0 dt)
(define y (integral (delay dy) y0 dt))
(define dy (stream-map f y))
y)
(stream-ref (solve (lambda (y) y) 1 0.001) 1000) ;; > 2.7169239322359
;; ex 3.78
;; 음...
(define (solve-2nd a b y0 dy0 dt dydt)
(define y (integral (delay dy) y0 dt))
(define dy (integral (delay ddy) dy0 dydt))
(define ddy (add-streams
(scale-stream dy (* -1 a))
(scale-stream y (* -1 b))))
y)
;; (solve-2nd -1 2 1 -4 0.001 0.001)
;; ex 3.79
;; 음...
(define (solve-2nd f y0 dy0 dt dydt)
(define y (integral (delay dy) y0 dt))
(define dy (integral (delay ddy) dy0 dydt))
(define ddy (stream-map f dy y))
y)
;; (solve-2nd (lambda (dy y) (+ (* dy -1) (* y 2))) 1 -4 0.001 0.001)