2020-10-16 03:14:22 +02:00
|
|
|
(define (average a b) (/ (+ a b) 2.0))
|
|
|
|
|
|
|
|
(define (search f neg-point pos-point)
|
|
|
|
(let ((midpoint (average neg-point pos-point)))
|
|
|
|
(if (close-enough? neg-point pos-point)
|
|
|
|
midpoint
|
|
|
|
(let ((test-value (f midpoint)))
|
|
|
|
(cond ((positive? test-value)
|
|
|
|
(search f neg-point midpoint))
|
|
|
|
((negative? test-value)
|
|
|
|
(search f midpoint pos-point))
|
|
|
|
(else midpoint))))))
|
|
|
|
|
|
|
|
(define (close-enough? x y)
|
|
|
|
(< (abs (- x y)) 0.001))
|
|
|
|
|
|
|
|
(define (half-interval-method f a b)
|
|
|
|
(let ((a-value (f a))
|
|
|
|
(b-value (f b)))
|
|
|
|
(cond ((and (negative? a-value) (positive? b-value))
|
|
|
|
(search f a b))
|
|
|
|
((and (negative? b-value) (positive? a-value))
|
|
|
|
(search f b a))
|
|
|
|
(else
|
|
|
|
(error "Values are not of opposite sign" a b)))))
|
|
|
|
|
|
|
|
(display (half-interval-method sin 2.0 4.0)) (newline)
|
|
|
|
|
|
|
|
(define tolerance 0.00001)
|
|
|
|
(define (fixed-point f first-guess)
|
|
|
|
(define (close-enough? v1 v2)
|
|
|
|
(< (abs (- v1 v2)) tolerance))
|
|
|
|
(define (try guess)
|
|
|
|
(let ((next (f guess)))
|
|
|
|
(if (close-enough? guess next)
|
|
|
|
next
|
|
|
|
(try next))))
|
|
|
|
(try first-guess))
|
|
|
|
|
|
|
|
(display (fixed-point cos 1.0)) (newline)
|
|
|
|
|
|
|
|
(define (sqrt x)
|
|
|
|
(fixed-point (lambda (y) (/ x y))
|
|
|
|
1.0))
|
|
|
|
|
|
|
|
; (display (sqrt 2) (newline)) ; doesn't converge
|
|
|
|
|
|
|
|
(define (sqrt x)
|
|
|
|
(fixed-point (lambda (y) (average y (/ x y)))
|
|
|
|
1.0))
|
|
|
|
|
|
|
|
(display (sqrt 2))
|
|
|
|
|
|
|
|
(newline)(newline) (display "ex-1.35") (newline)
|
|
|
|
|
|
|
|
; phi^2 = phi + 1
|
|
|
|
; phi = 1 + 1 / phi
|
|
|
|
|
|
|
|
(display (fixed-point (lambda (phi) (+ 1 (/ 1.0 phi))) 1.0)) (newline)
|
|
|
|
|
|
|
|
|
|
|
|
(newline)(newline) (display "ex-1.36") (newline)
|
|
|
|
|
|
|
|
(define (x_without_avg_damping x) (/ (log 1000) (log x)))
|
|
|
|
(define (x_with_avg_damping x)
|
|
|
|
(average x (/ (log 1000) (log x))))
|
|
|
|
|
|
|
|
(define (fixed-point f first-guess)
|
|
|
|
(define (close-enough? v1 v2)
|
|
|
|
(< (abs (- v1 v2)) tolerance))
|
|
|
|
(define (try guess)
|
|
|
|
(display guess) (newline)
|
|
|
|
(let ((next (f guess)))
|
|
|
|
(if (close-enough? guess next)
|
|
|
|
next
|
|
|
|
(try next))))
|
|
|
|
(try first-guess))
|
|
|
|
|
|
|
|
(newline)
|
|
|
|
(display (fixed-point x_without_avg_damping 2.0))(newline)
|
|
|
|
(display "Finished without average damping.")
|
|
|
|
(newline)
|
|
|
|
(newline)
|
|
|
|
(display (fixed-point x_with_avg_damping 2.0))(newline)
|
|
|
|
(display "Finished with average damping.")
|
|
|
|
|
|
|
|
|
|
|
|
(newline)(newline) (display "ex-1.37 a)") (newline)
|
|
|
|
|
|
|
|
; Recursive
|
|
|
|
(define (cont-frac n d k)
|
|
|
|
(define (frac-rec i)
|
|
|
|
(if (> i k)
|
|
|
|
0
|
|
|
|
(/ (n i) (+ (d i) (frac-rec (+ i 1))))))
|
|
|
|
(frac-rec 1))
|
|
|
|
|
|
|
|
(define (phi k)
|
|
|
|
(/ 1 (cont-frac (lambda (i) 1.0) (lambda (i) 1.0) k)))
|
|
|
|
|
|
|
|
(display (phi 100))
|
|
|
|
|
|
|
|
(define (approx-phi tolerance)
|
|
|
|
(define (iteration current-phi i)
|
|
|
|
(let ((next-phi (phi i)))
|
|
|
|
(if (< (abs (- next-phi current-phi)) tolerance)
|
|
|
|
i
|
|
|
|
(iteration next-phi (+ i 1)))))
|
|
|
|
(iteration 1.1 1))
|
|
|
|
|
|
|
|
; Use approx-phi to calculate value of k to get four digit precisious.
|
|
|
|
(newline)
|
|
|
|
(display (approx-phi 0.00009)) ; 12
|
|
|
|
|
|
|
|
; Phi is 1.618033 so let's see if we can get many digits right with k = 12
|
|
|
|
|
|
|
|
(newline)
|
|
|
|
(display (phi 11))
|
|
|
|
(newline)
|
|
|
|
(display (phi 12))
|
|
|
|
(newline)
|
|
|
|
(display (phi 13))
|
|
|
|
; looks like we have found exactly the right value (:
|
|
|
|
|
|
|
|
; Recursive wrong
|
|
|
|
(define (cont-frac n d k)
|
|
|
|
(if (= k 1) 0
|
|
|
|
(/ (n k) (+ (d k) (cont-frac n d (- k 1))))))
|
|
|
|
|
|
|
|
(newline)(newline) (display "ex-1.37 b) - implemented iterative version") (newline)
|
|
|
|
|
|
|
|
; (phi 100000) ; show that previous version is recursive.
|
|
|
|
|
|
|
|
; Iterative
|
|
|
|
(define (cont-frac n d k)
|
|
|
|
(define (frac-iter i acc)
|
|
|
|
(if (= i 0)
|
|
|
|
acc
|
|
|
|
(frac-iter (- i 1) (/ (n i) (+ (d i) acc)))))
|
|
|
|
(frac-iter k 0))
|
|
|
|
|
|
|
|
(phi 100000) ; show that this version is iterative
|
|
|
|
|
|
|
|
|
|
|
|
(newline) (display "ex-1.38") (newline)
|
|
|
|
|
|
|
|
; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ; Indicies
|
|
|
|
; 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8 ; Eulers expansion
|
|
|
|
|
|
|
|
(define (eulers-expansion k)
|
|
|
|
(define (n i) 1)
|
|
|
|
(define (d i)
|
|
|
|
(if (= (remainder (+ i 1) 3) 0)
|
|
|
|
(* 2 (/ (+ i 1) 3))
|
|
|
|
1))
|
|
|
|
(cont-frac n d k))
|
|
|
|
|
|
|
|
(display (+ 2 (/ (eulers-expansion 1000) 1.)))
|
|
|
|
|
|
|
|
(newline)(newline) (display "ex-1.39") (newline)
|
|
|
|
|
|
|
|
(define (tan-cf x k)
|
|
|
|
(define (n i)
|
|
|
|
(if (= i 1)
|
|
|
|
x
|
|
|
|
(* x x -1)))
|
|
|
|
(define (d i) (- (* i 2) 1))
|
|
|
|
(cont-frac n d k))
|
|
|
|
|
|
|
|
(display (tan 1.1)) (newline)
|
|
|
|
(display (tan-cf 1.1 15)) (newline)
|
|
|
|
|
|
|
|
|
|
|
|
(newline) (display "tests") (newline)
|
|
|
|
|
|
|
|
(define (average-damp f)
|
|
|
|
(lambda (x) (average x (f x))))
|
|
|
|
|
|
|
|
(define (sqrt x)
|
|
|
|
(fixed-point (average-damp (lambda (y) y (/ x y)))
|
|
|
|
1.0))
|
|
|
|
|
|
|
|
(display (sqrt 9)) (newline)
|
|
|
|
|
|
|
|
(define dx 0.0000001)
|
|
|
|
(define (deriv g)
|
|
|
|
(lambda (x)
|
|
|
|
(/ (- (g (+ x dx)) (g x))
|
|
|
|
dx)))
|
|
|
|
|
|
|
|
(define (newton-transform g)
|
|
|
|
(lambda (x)
|
|
|
|
(- x (/ (g x) ((deriv g) x)))))
|
|
|
|
(define (newtons-method g guess)
|
|
|
|
(fixed-point (newton-transform g) guess))
|
|
|
|
|
|
|
|
(define (sqrt x)
|
|
|
|
(newtons-method (lambda (y) (- (* y y) x)) 1.0))
|
|
|
|
|
|
|
|
(newline)
|
2020-11-15 17:30:56 +01:00
|
|
|
(display "example - Newton's Method") (newline)
|
2020-10-16 03:14:22 +02:00
|
|
|
(display (sqrt 3)) (newline)
|