#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