Root Finder Interact

Description

Here is a Sage interact that estimates the roots of a function using the bisection method. The user may input the function and the initial endpoints of the estimation range.

Sage Cell

Code

def bisect_method(f, a, b, eps):
    try:
        f = f._fast_float_(f.variables()[0])
    except AttributeError:
        pass
    intervals = [(a,b)]
    two = float(2); eps = float(eps)
    while True:
        c = (a+b)/two
        fa = f(a); fb = f(b); fc = f(c)
        if abs(fc) < eps: return c, intervals
        if fa*fc < 0:
            a, b = a, c
        elif fc*fb < 0:
            a, b = c, b
        else:
            raise ValueError("f must have a sign change in the interval (%s,%s)"%(a,b))
        intervals.append((a,b))
pretty_print(html("<h1>Double Precision Root Finding Using Bisection</h1>"))
@interact
def _(f = cos(x) - x, a = float(0), b = float(1), eps=(-3,(-16, -1))):
     eps = 10^eps
     print("eps = %s" % float(eps))
     try:
         c, intervals = bisect_method(f, a, b, eps)
     except ValueError:
         print("f must have opposite sign at the endpoints of the interval")
         show(plot(f, a, b, color='red'), xmin=a, xmax=b)
     else:
         print("root =", c)
         print("f(c) = %r" % f(x=c))
         print("iterations =", len(intervals))
         P = plot(f, a, b, color='red')
         h = (P.ymax() - P.ymin())/ (1.5*len(intervals))
         L = sum(line([(c,h*i), (d,h*i)]) for i, (c,d) in enumerate(intervals) )
         L += sum(line([(c,h*i-h/4), (c,h*i+h/4)]) for i, (c,d) in enumerate(intervals) )
         L += sum(line([(d,h*i-h/4), (d,h*i+h/4)]) for i, (c,d) in enumerate(intervals) )
         show(P + L, xmin=a, xmax=b)

Options

None

Tags

Primary Tags: Single Variable Calculus: Limits and continuity

Secondary Tags: Limits and continuity: Applications - other

Related Cells

None

Attribute

Permalink: https://wiki.sagemath.org/interact/calculus#Root_Finding_Using_Bisection

Author: William Stein

Date: 19 Jul 2020 01:53

Submitted by: Zane Corbiere

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License