Lecture 19: Roots: Eurekas from Mathematics





  1. #|
        find-root: (N -> N) N -> N u #f
        (define (find-root f i) ...)
    
        Purpose: 
         j in [0,i] such that (f i) = 0
         otherwise #f
    |#
    
    (define (find-root f i)
      (cond
        ((zero? i) (cond
    		 ((= (f i) 0) i)
    		 (else #f)))
        (else (cond
    	    ((= (f i) 0) i)
    	    (else (find-root f (sub1 i)))))))
    
    Here is an improvement, based on the laws of cond:
    (define (find-root f i)
      (cond
        ((= (f i) 0) i)
        ((zero? i) #f)
        (else (find-root f (sub1 i)))))
    
    Does this tell us that find-root recurs on N? (NOPE)

  2. let's find the root of a continuous function g
    #|
        find-root: (R -> R) R -> R
        (define (find-root f a) ...)
    
        Purpose: 
         x in [0,a] such that (abs (f a)) <= 0
    |#
    
    How do we know that f has a root? We don't. So let's assume a bit more: f(0) < 0 and f(a) > 0. Here is the graph:

    The Eureka: Mean Value Theorem. If f(b) is below 0 and f(a) is above 0, then f(x) = 0 for some x between b and a. -- So we split the interval into two parts and focus on the one that again satisfies the condition. When the interval is small enough, we stop.

    #|
       find-root : (number -> number) number number -> number
       the result $r$ is the left boundary of an interval [r,r+TOLERANCE]
       in which f has a root (\ie, (f x) = 0 for some x in the interval
       
       ASSUMPTION: f is continuous and monotone
    |#
    (define (find-root f left right)
      (cond
        ((<= (- right left) TOLERANCE) left)
        (else 
          (local ((define mid (/ (+ left right) 2)))
    	(cond
    	  ((<= (f left) 0 (f mid)) 
               (find-root left mid))
    	  (else 
               (find-root mid right)))))))
    


  3. Now let's return to the function on N. What do we have to change? TOLERANCE must become 1 or 0? What else needs to change? The division. #| find-root-N : (N -> N) N N -> N Purpose: see above |# (define (find-root-N f left right) (cond ((<= (- right left) 1) left) (else (local ((define mid (quotient (+ left right) 2))) (cond ((<= (f left) 0 (f mid)) (find-root left mid)) (else (find-root mid right)))))))

    We will see another application of this idea somewhere down the road.

    General idea: consider the continuous counterpart, use knowledge from analysis, and go back to discrete world.




Matthias Felleisen This page was generated on Fri Apr 9 09:17:38 CDT 1999.