timothy235 icon

sicp-1-3-3-procedures-as-general-methods

timothy235 | PRO | 12/19/24 01:21:24 AM UTC (Edited) | 0 ⭐ | 383 👁️ | Never ⏰ | []
Racket |

4.52 KB

|

None

|

0 👍

/

0 👎

#lang racket
 
;;;;;;;;;;
;; 1.35 ;;
;;;;;;;;;;
 
(define tolerance 0.00001)
(define (close-enough? v1 v2)
  (< (abs (- v1 v2)) tolerance))
 
(define (fixed-point f first-guess)
  (define (try guess)
    (let ([next (f guess)])
      (if (close-enough? guess next)
        next
        (try next))))
  (try first-guess))
 
;; phi is the root of x ^ 2 - x - 1.  So it is the fixed point of f(x) = 1 + 1 / x.
 
(/ (+ 1 (sqrt 5)) 2) ; phi
;; 1.618033988749895
 
(fixed-point (lambda (x) (+ 1 (/ 1 x))) 1.0)
;; 1.6180327868852458
 
;;;;;;;;;;
;; 1.36 ;;
;;;;;;;;;;
 
(define (new-fixed-point f first-guess)
  (define (try guess)
    (displayln guess)
    (let ([next (f guess)])
      (if (close-enough? guess next)
        next
        (try next))))
  (try first-guess))
 
(define soln
  (new-fixed-point (lambda (x) (/ (log 1000) (log x)))
                   2.0)) ; took 24 iterations
;; 2.0
;; 9.965784284662087
;; 3.004472209841214
;; 6.279195757507157
;; 3.759850702401539
;; 5.215843784925895
;; 4.182207192401397
;; 4.8277650983445906
;; 4.387593384662677
;; 4.671250085763899
;; 4.481403616895052
;; 4.6053657460929
;; 4.5230849678718865
;; 4.577114682047341
;; 4.541382480151454
;; 4.564903245230833
;; 4.549372679303342
;; 4.559606491913287
;; 4.552853875788271
;; 4.557305529748263
;; 4.554369064436181
;; 4.556305311532999
;; 4.555028263573554
;; 4.555870396702851
;; 4.555315001192079
;; 4.5556812635433275
;; 4.555439715736846
;; 4.555599009998291
;; 4.555493957531389
;; 4.555563237292884
;; 4.555517548417651
;; 4.555547679306398
;; 4.555527808516254
;; 4.555540912917957
 
(expt soln soln) ; should be 1000
;; 999.9913579312362
 
(define (average a b)
  (/ (+ a b) 2))
 
(define (new-damped-fixed-point f first-guess)
  (define (try guess)
    (displayln guess)
    (let ([next (average guess (f guess))])
      (if (close-enough? guess next)
        next
        (try next))))
  (try first-guess))
 
(define damped-soln
  (new-damped-fixed-point (lambda (x) (/ (log 1000) (log x)))
                          2.0)) ; took 9 iterations
;; 2.0
;; 5.9828921423310435
;; 4.922168721308343
;; 4.628224318195455
;; 4.568346513136242
;; 4.5577305909237005
;; 4.555909809045131
;; 4.555599411610624
;; 4.5555465521473675
 
(expt damped-soln damped-soln) ; should be 1000
;; 1000.0046472054871
 
;;;;;;;;;;
;; 1.37 ;;
;;;;;;;;;;
 
(define (cont-frac n d k)
  (define (get-tail i) ; return n(i) / [d(i) + ...]
    (if (= i k)
      (/ (n k) (d k))
      (/ (n i) (+ (d i) (get-tail (add1 i))))))
  (get-tail 1))
 
(define (estimate-one-over-phi k)
  (cont-frac (lambda (i) 1.0)
             (lambda (i) 1.0)
             k))
 
(/ 2 (add1 (sqrt 5))) ; this is 1 / phi
;; 0.6180339887498948
 
(for ([k (in-range 1 15)]) (displayln (estimate-one-over-phi k)))
;; 1.0
;; 0.5
;; 0.6666666666666666
;; 0.6000000000000001
;; 0.625
;; 0.6153846153846154
;; 0.6190476190476191
;; 0.6176470588235294
;; 0.6181818181818182
;; 0.6179775280898876
;; 0.6180555555555556 ; k = 11 gives four places of accuracy
;; 0.6180257510729613
;; 0.6180371352785146
;; 0.6180327868852459
 
(define (iterative-cont-frac n d k)
  (define (iter i tail)
    ; the invariant is tail = n(i + 1) / [d(i + 1) + ...]
    (if (zero? i)
      tail
      (iter (sub1 i) (/ (n i) (+ (d i) tail)))))
  (iter k 0))
 
(define (iterative-estimate-one-over-phi k)
  (iterative-cont-frac (lambda (i) 1.0)
                       (lambda (i) 1.0)
                       k))
 
(for ([k (in-range 1 10)]) (displayln (iterative-estimate-one-over-phi k)))
;; 1.0
;; 0.5
;; 0.6666666666666666
;; 0.6000000000000001
;; 0.625
;; 0.6153846153846154
;; 0.6190476190476191
;; 0.6176470588235294
;; 0.6181818181818182
 
;;;;;;;;;;
;; 1.38 ;;
;;;;;;;;;;
 
(exp 1) ; this is e
;; 2.718281828459045
 
(define (euler-n i) 1)
(define (euler-d i)
  (if (= (remainder i 3) 2)
    (* 2 (/ (add1 i) 3))
    1))
 
(define (estimate-e k)
  (+ 2.0 (cont-frac euler-n euler-d k)))
 
(for ([k (in-range 1 10)]) (displayln (estimate-e k)))
;; 3.0
;; 2.666666666666666
;; 2.75
;; 2.714285714285714
;; 2.71875
;; 2.717948717948718
;; 2.718309859154929
;; 2.718279569892473
;; 2.718283582089552
 
;;;;;;;;;;
;; 1.39 ;;
;;;;;;;;;;
 
(define (tan-cf x k)
  (define (n i)
    (if (= i 1)
      x
      (- (sqr x))))
  (define (d i)
    (sub1 (* 2 i)))
  (cont-frac n d k))
 
(tan pi)
;; -1.2246467991473532e-016
(tan-cf pi 10)
;; -1.893214149359168e-009
 
(tan (/ pi 4))
;; 0.9999999999999999
(tan-cf (/ pi 4) 10)
;; 1.0

Comments