Skip to content

half-interval

; Half-interval method for finding roots of
; f(x) = 0
(define (average a b) (/ (+ a b) 2))
(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))
; This will give wrong answer if we directly supply points
; at which f(x) do not have requried sign

; A better wrapper method
(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 (positive? a-value) (negative? b-value))
               (search f b a))
              (else 
                (error "Values are not of opposite sign" a b)))))


(half-interval-method sin 2.0 4.0) ;Value: 3.14111328125

(half-interval-method (lambda (x) (- (* x x x) (* 2 x) 3)) 
                      1.0
                      2.0) ;Value: 1.89306640625