Exercise 3.65. Use the series 1 1 1 ln 2 = 1 - ― + ― - ― 2 3 4 to compute three sequences of approximations to the natural logarithm of 2, in the same way we did above for π. How rapidly do these sequences converge? ———————————————————————————————————————————————————————————————————————— (define (ln2-terms n) (cons-stream (/ 1.0 n) (stream-map - (ln2-terms (+ n 1))))) (define ln2-approx (partial-sums (ln2-terms 1))) ;; dependencies from previous exercises or the text: (define (partial-sums s) (define stream (cons-stream 0 (add-streams s stream))) (stream-cdr stream)) (define (add-streams s1 s2) (stream-map + s1 s2)) (define (display-stream-n s limit) (define (go n) (cond ((= n limit) "...") (else (display (stream-ref s n)) (newline) (go (+ n 1))))) (go 0)) (define (euler-transform s) (let ((s0 (stream-ref s 0)) ; Sn-1 (s1 (stream-ref s 1)) ; Sn (s2 (stream-ref s 2))) ; Sn+1 (cons-stream (- s2 (/ (square (- s2 s1)) (+ s0 (* -2 s1) s2))) (euler-transform (stream-cdr s))))) (define (make-tableau transform s) (cons-stream s (make-tableau transform (transform s)))) (define (accelerated-sequence transform s) (stream-map stream-car (make-tableau transform s))) 1 ]=> (display-stream-n ln2-approx 8) 1. .5 .8333333333333333 .5833333333333333 .7833333333333332 .6166666666666666 .7595238095238095 .6345238095238095 1 ]=> (display-stream-n (euler-transform ln2-approx) 8) .7 .6904761904761905 .6944444444444444 .6924242424242424 .6935897435897436 .6928571428571428 .6933473389355742 .6930033416875522 1 ]=> (display-stream-n (make-tableau euler-transform ln2-approx) 8) (1. . #[promise 17]) (.7 . #[promise 18]) (.6932773109243697 . #[promise 19]) (.6931488693329254 . #[promise 20]) (.6931471960735491 . #[promise 21]) (.6931471806635636 . #[promise 22]) (.6931471805604039 . #[promise 23]) (.6931471805599445 . #[promise 24]) 1 ]=> (log 2) ;Value: .6931471805599453 So, as expected, the "tableau" converges much faster than the single Euler transform, which in turn converges faster than the initial approximation.