Here is the math:
Given:
f: R -> R
r: R
Tangent at r:
t(x) - f(r)
----------- = f'(r)
x - r
Therefore the root s of the tangent at r is
f(r)
s = r - -----
f'(r)
Okay, so now define a function that does all that:
#|
find-root-newton : (number -> number) number number -> number
the result r is such that (abs (f r)) <= TOLERANCE
ASSUMPTION: f is continuous
|#
(define (find-root-newton f r0)
(cond
((<= (abs (f r0)) tolerance)
r)
(else (find-root-newton f (root-of-tangent f r0)))))
(define (root-of-tangent f r0)
(- r0 (/ (f r0)
((d/dx f) r0))))
(define (find-root-newton f r0)
(local ((define (find-root-newton f r0)
(cond
((<= (abs (f r0)) tolerance)
r)
(else (find-root-newton f (root-of-tangent f r0)))))
(define (root-of-tangent f r0)
(- r0 (/ (f r0)
((d/dx f) r0)))))
(find-root-newton f r0)))
= ; no need to pass around f when it's all inside
(define (find-root-newton f r0)
(local ((define (find-root-newton r0)
(cond
((<= (abs (f r0)) tolerance)
r)
(else (find-root-newton (root-of-tangent r0)))))
(define (root-of-tangent f r0)
(- r0 (/ (f r0)
((d/dx f) r0)))))
(find-root-newton r0)))
= ; no need to recompute the derivative all the time
(define (find-root-newton f r0)
(local ((define (find-root-newton r0)
(cond
((<= (abs (f r)) tolerance)
r)
(else (find-root-newton (root-of-tangent r0)))))
(define (root-of-tangent f r0)
(- r0 (/ (f r0)
(fprime r0))))
(define fprime (d/dx f)))
(find-root-newton r0)))
template -- reflects "eureka", not data structure
(define (generative-recursive-fun problem-data)
(cond
((trivially-solvable_1? problem-data)
(determine-solution_1 problem-data))
...
((trivially-solvable_N? problem-data)
(determine-solution_N problem-data))
(else
(combine-solutions
problem-data
(generative-recursive-fun (generate-problem_1 problem-data))
...
(generative-recursive-fun (generate-problem_N problem-data))))))
|
| termination: why do these algorithms terminate? |
Termination argument:
NEWTON when it doesn't terminate: If f'(guess) = 0, the algorithm does not terminate; it loops for ever.
QUICK-SORT: if we use
(quick-sort (filter (lambda (x) (>= x pivot)) alon))we never terminate -- because there will always be at least one item in this list.
| Matthias Felleisen | This page was generated on Fri Apr 9 09:17:38 CDT 1999. |