Advertisement
timothy235

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

Feb 17th, 2016
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 4.52 KB | None | 0 0
  1. #lang racket
  2.  
  3. ;;;;;;;;;;
  4. ;; 1.35 ;;
  5. ;;;;;;;;;;
  6.  
  7. (define tolerance 0.00001)
  8. (define (close-enough? v1 v2)
  9.   (< (abs (- v1 v2)) tolerance))
  10.  
  11. (define (fixed-point f first-guess)
  12.   (define (try guess)
  13.     (let ([next (f guess)])
  14.       (if (close-enough? guess next)
  15.         next
  16.         (try next))))
  17.   (try first-guess))
  18.  
  19. ;; phi is the root of x ^ 2 - x - 1.  So it is the fixed point of f(x) = 1 + 1 / x.
  20.  
  21. (/ (+ 1 (sqrt 5)) 2) ; phi
  22. ;; 1.618033988749895
  23.  
  24. (fixed-point (lambda (x) (+ 1 (/ 1 x))) 1.0)
  25. ;; 1.6180327868852458
  26.  
  27. ;;;;;;;;;;
  28. ;; 1.36 ;;
  29. ;;;;;;;;;;
  30.  
  31. (define (new-fixed-point f first-guess)
  32.   (define (try guess)
  33.     (displayln guess)
  34.     (let ([next (f guess)])
  35.       (if (close-enough? guess next)
  36.         next
  37.         (try next))))
  38.   (try first-guess))
  39.  
  40. (define soln
  41.   (new-fixed-point (lambda (x) (/ (log 1000) (log x)))
  42.                    2.0)) ; took 24 iterations
  43. ;; 2.0
  44. ;; 9.965784284662087
  45. ;; 3.004472209841214
  46. ;; 6.279195757507157
  47. ;; 3.759850702401539
  48. ;; 5.215843784925895
  49. ;; 4.182207192401397
  50. ;; 4.8277650983445906
  51. ;; 4.387593384662677
  52. ;; 4.671250085763899
  53. ;; 4.481403616895052
  54. ;; 4.6053657460929
  55. ;; 4.5230849678718865
  56. ;; 4.577114682047341
  57. ;; 4.541382480151454
  58. ;; 4.564903245230833
  59. ;; 4.549372679303342
  60. ;; 4.559606491913287
  61. ;; 4.552853875788271
  62. ;; 4.557305529748263
  63. ;; 4.554369064436181
  64. ;; 4.556305311532999
  65. ;; 4.555028263573554
  66. ;; 4.555870396702851
  67. ;; 4.555315001192079
  68. ;; 4.5556812635433275
  69. ;; 4.555439715736846
  70. ;; 4.555599009998291
  71. ;; 4.555493957531389
  72. ;; 4.555563237292884
  73. ;; 4.555517548417651
  74. ;; 4.555547679306398
  75. ;; 4.555527808516254
  76. ;; 4.555540912917957
  77.  
  78. (expt soln soln) ; should be 1000
  79. ;; 999.9913579312362
  80.  
  81. (define (average a b)
  82.   (/ (+ a b) 2))
  83.  
  84. (define (new-damped-fixed-point f first-guess)
  85.   (define (try guess)
  86.     (displayln guess)
  87.     (let ([next (average guess (f guess))])
  88.       (if (close-enough? guess next)
  89.         next
  90.         (try next))))
  91.   (try first-guess))
  92.  
  93. (define damped-soln
  94.   (new-damped-fixed-point (lambda (x) (/ (log 1000) (log x)))
  95.                           2.0)) ; took 9 iterations
  96. ;; 2.0
  97. ;; 5.9828921423310435
  98. ;; 4.922168721308343
  99. ;; 4.628224318195455
  100. ;; 4.568346513136242
  101. ;; 4.5577305909237005
  102. ;; 4.555909809045131
  103. ;; 4.555599411610624
  104. ;; 4.5555465521473675
  105.  
  106. (expt damped-soln damped-soln) ; should be 1000
  107. ;; 1000.0046472054871
  108.  
  109. ;;;;;;;;;;
  110. ;; 1.37 ;;
  111. ;;;;;;;;;;
  112.  
  113. (define (cont-frac n d k)
  114.   (define (get-tail i) ; return n(i) / [d(i) + ...]
  115.     (if (= i k)
  116.       (/ (n k) (d k))
  117.       (/ (n i) (+ (d i) (get-tail (add1 i))))))
  118.   (get-tail 1))
  119.  
  120. (define (estimate-one-over-phi k)
  121.   (cont-frac (lambda (i) 1.0)
  122.              (lambda (i) 1.0)
  123.              k))
  124.  
  125. (/ 2 (add1 (sqrt 5))) ; this is 1 / phi
  126. ;; 0.6180339887498948
  127.  
  128. (for ([k (in-range 1 15)]) (displayln (estimate-one-over-phi k)))
  129. ;; 1.0
  130. ;; 0.5
  131. ;; 0.6666666666666666
  132. ;; 0.6000000000000001
  133. ;; 0.625
  134. ;; 0.6153846153846154
  135. ;; 0.6190476190476191
  136. ;; 0.6176470588235294
  137. ;; 0.6181818181818182
  138. ;; 0.6179775280898876
  139. ;; 0.6180555555555556 ; k = 11 gives four places of accuracy
  140. ;; 0.6180257510729613
  141. ;; 0.6180371352785146
  142. ;; 0.6180327868852459
  143.  
  144. (define (iterative-cont-frac n d k)
  145.   (define (iter i tail)
  146.     ; the invariant is tail = n(i + 1) / [d(i + 1) + ...]
  147.     (if (zero? i)
  148.       tail
  149.       (iter (sub1 i) (/ (n i) (+ (d i) tail)))))
  150.   (iter k 0))
  151.  
  152. (define (iterative-estimate-one-over-phi k)
  153.   (iterative-cont-frac (lambda (i) 1.0)
  154.                        (lambda (i) 1.0)
  155.                        k))
  156.  
  157. (for ([k (in-range 1 10)]) (displayln (iterative-estimate-one-over-phi k)))
  158. ;; 1.0
  159. ;; 0.5
  160. ;; 0.6666666666666666
  161. ;; 0.6000000000000001
  162. ;; 0.625
  163. ;; 0.6153846153846154
  164. ;; 0.6190476190476191
  165. ;; 0.6176470588235294
  166. ;; 0.6181818181818182
  167.  
  168. ;;;;;;;;;;
  169. ;; 1.38 ;;
  170. ;;;;;;;;;;
  171.  
  172. (exp 1) ; this is e
  173. ;; 2.718281828459045
  174.  
  175. (define (euler-n i) 1)
  176. (define (euler-d i)
  177.   (if (= (remainder i 3) 2)
  178.     (* 2 (/ (add1 i) 3))
  179.     1))
  180.  
  181. (define (estimate-e k)
  182.   (+ 2.0 (cont-frac euler-n euler-d k)))
  183.  
  184. (for ([k (in-range 1 10)]) (displayln (estimate-e k)))
  185. ;; 3.0
  186. ;; 2.666666666666666
  187. ;; 2.75
  188. ;; 2.714285714285714
  189. ;; 2.71875
  190. ;; 2.717948717948718
  191. ;; 2.718309859154929
  192. ;; 2.718279569892473
  193. ;; 2.718283582089552
  194.  
  195. ;;;;;;;;;;
  196. ;; 1.39 ;;
  197. ;;;;;;;;;;
  198.  
  199. (define (tan-cf x k)
  200.   (define (n i)
  201.     (if (= i 1)
  202.       x
  203.       (- (sqr x))))
  204.   (define (d i)
  205.     (sub1 (* 2 i)))
  206.   (cont-frac n d k))
  207.  
  208. (tan pi)
  209. ;; -1.2246467991473532e-016
  210. (tan-cf pi 10)
  211. ;; -1.893214149359168e-009
  212.  
  213. (tan (/ pi 4))
  214. ;; 0.9999999999999999
  215. (tan-cf (/ pi 4) 10)
  216. ;; 1.0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement