Ask Your Question

Find all roots of an equation

asked 2018-01-24 04:56:04 +0200

happys5 gravatar image


I have tried the following: used solve() by itself and with "to_solve_poly=True", imported simpy, tried find_root, and tried eq.roots(). find_root() gave me one root when there are several between 0,11.

How can I solve for all the roots in a range. Here is my final code.


PI = 2*asin(1.0)
eq = exp(-x)-sin(0.5*PI*x)==0
show(plot(exp(-x)-sin(0.5*PI*x), x, xmin = -10, xmax = 10, ymin =-10, ymax=10))
eq.find_root(0, 11)
edit retag flag offensive close merge delete

2 Answers

Sort by ยป oldest newest most voted

answered 2018-01-24 14:09:31 +0200

tmonteil gravatar image

updated 2018-01-24 23:15:03 +0200

First, note that you can use the symbolic pi directly:

sage: eq = exp(-x)-sin(pi*x/2)==0

Then the find_root method only gives you one root that belongs to the interval. If you want all the roots, you have to localize:

sage: eq.find_root(0,1)
sage: eq.find_root(0,2)
sage: eq.find_root(2,5)
sage: eq.find_root(5,7)
sage: eq.find_root(7,9)
sage: eq.find_root(9,11)

Or, more compactly:

sage: endpoints = [0,1,2,5,7,9,11]
sage: [eq.find_root(i,j) for (i,j) in zip(endpoints,endpoints[1:])]
edit flag offensive delete link more


To complete tmonteil's answer : you can show that for x>5, say, $e^{-x}$ is negligible compared to $\sin(x)$, with a small upper bound $b$. Given that the slope of $\sin(x)$ is also bounded by -1 and 1 and continuity pf those functions, you can deduce (Rolle's theorem and corollaries) a "research box" around the (known) roots of $\sin{x}$ guaranteeing you that $e^{-x}\sin{\frac{\pi x}{2}}$ has exactly one root in this box, numerically found by bfind_root with arbitrary precision. Thius obtraining an arnitrarily precise solution.

You can also show that your function has no negative roots, and finally establish, by similar arguments the existence of three roots between 0 and 5.

Emmanuel Charpentier gravatar imageEmmanuel Charpentier ( 2020-09-19 00:39:48 +0200 )edit

answered 2020-09-18 22:19:34 +0200

cybervigilante gravatar image

Although for other functions, if there is no root in an interval, you get a RuntimeError that has to be accounted for. So, a bit more obtuse example:

var('k x')
eq = x^3-5*x^2+15==0
ranges = [[k,k+1] for k in [-10..10]]

for width in ranges:
        root = eq.find_root(width[0],width[1])
        print(f"Root between {width[0]} and {width[1]} is {root}")
    except RuntimeError:
        print(f"No root between {width[0]} and {width[1]}")
edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower


Asked: 2018-01-24 04:56:04 +0200

Seen: 6,172 times

Last updated: Sep 18 '20