# How can I use assumptions with FindRoot?

I have something like

FindRoot[f[x], {x, a}]


Now I want FindRoot to constrain the solutions to 0 < x < 1. How can I obtain this?

• The easiest (and probably not the fastest) way for you might be to Select the solutions given by FindRoot. – Öskå Mar 13 '13 at 14:44
• Maybe something like Cases[FindRoot[...],Rule[_,_>0]..&&Rule[_,_<1].. (I'm not sure whether the pattern is the best to filter solutions). – Sos Mar 13 '13 at 14:50

I would call these constraints, not assumptions.

From the docs,

FindRoot[lhs==rhs,{$x$, $x_{\text{start}}$, $x_{\text{min}}$, $x_{\text{max}}$}] searches for a solution, stopping the search if x ever gets outside the range $x_{\text{min}}$ to $x_{\text{max}}$

Keep in mind that FindRoot uses iterative numerical methods such as Newton's method or Brent's method which will converge to a single solution, but will not find all solutions. What this syntax does is simply stop the iteration as soon as $x$ gets outside of the specified range. If this happens, it does not mean that there are no solutions inside that range.

Here's a concrete example where there are several roots, but the search stops as soon as the method reached the edge of the search region:

In:= FindRoot[Sin[x], {x, 1, .1, 10}]

During evaluation of In:= FindRoot::reged: The point {0.1} is at the edge of the
search region {0.1,10.} in coordinate 1 and the computed search direction points
outside the region. >>

Out= {x -> 0.1}


If you need to find all roots inside an interval, I'd recommend using Reduce which will often work (if using Mathematica 7 or later). Note that while Reduce may not be able to find solution for the general case, it will very often work if you restrict the search domain to a real interval. Even for hard problems with transcendental functions.

• Although if I stick with my f[x_]:=Sin[x*10] and if I use FindRoot[f[x] == 0, {x, 0, 0, 1}] the only answer it gives is 0.. Any clue why? – Öskå Mar 13 '13 at 16:23
• @Öskå I explained that in this answer. FindRoot always returns only a single answer (for a single initial condition). – Szabolcs Mar 13 '13 at 16:40
• @Szabolcs Thanks. But now I remain with the problem that the function returns the value of the extreme to which the iteration leads. I wish that I'd get no value at all, if there was no root. Obviously, however, I can not a priori exclude extreme values​​, since there may be the case that these are effectively a solution. Any suggestions? – psmith Mar 16 '13 at 21:39
• @Fabrizio You can verify if the result you get is a root or not by substituting it back into the function, and checking if it gives zero. This will tell you for certain if it is an endpoint of the interval or it's also a root. But keep in mind that the search stopping at the edge of the interval does not mean that there are no roots within the interval! It merely means that the numerical method strayed outside the interval. There may still be roots there it didn't find before jumping outside. – Szabolcs Mar 16 '13 at 22:39
• @Fabrizio I just checked and FindRoot issues a message if it reaches the end. You can Check for this message. – Szabolcs Mar 16 '13 at 22:52

If you already know the interval on which you want to find one of your solution, you may use the instruction

FindRoot[f[x]==0,{x,xmin,xmax}]


Here, Mathematica will use Brent's algorithm (a combination of the bisection and secant methods) restricted to the interval [xmin,xmax]. With the example

FindRoot[Sin[x]==0, {x, .1, 10}]


where one searches for a solution in [0.1,10], the algorithm does not fail and leads to

{x -> 9.42478}


As in all finding-roots methods, Mathematica only find one solution (if it exists) on the interval, even if multiple solutions may exist.

• "dichotomy search" - you meant bisection, yes? It actually uses Brent's method, but it is true that bisection is one of the key ingredients of Brent… – J. M.'s technical difficulties Jun 18 '15 at 13:20
• @Guesswhoitis. Yes you are right (see documentation.), I updated my answer accordingly. – jibe Jun 18 '15 at 13:39
• It's actually more like "a combination of the bisection and secant methods with inverse quadratic interpolation", but that's a mouthful to say. Nevertheless, there's a reason why "Algorithms for Minimization Without Derivatives" is a classic book… – J. M.'s technical difficulties Jun 18 '15 at 13:46

f[x_] := Sin[x*10] Sort@DeleteDuplicates[Select[FindRoot[f[x], {x, Range[0, 1, 0.1]}][[1,2]], (0 <= # < 1)&],
Abs[#2 - #1] < 10^-8 &]


Gives:

{0., 0.314159, 0.628319, 0.942478}

This is one of the simpler ways to do it:

Solve[f[x] == 0 && 0 < x && x < 1, x]


Specifying conditions within Solve or any other function you are using is more efficient than playing Select on the results. This way, Mathematica knows where to look for solutions and only finds those within your constraints.

• But I need specifically FindRoot for solve my problem, and this doesn't work in that case. – psmith Mar 13 '13 at 15:41
• And why do you specifically need FindRoot? – cartonn Mar 13 '13 at 15:46
• because my problem is very hard, it also contains transcendental functions, so Solve doesn't work in this case. – psmith Mar 14 '13 at 8:21
• @Fabrizio Reduce will often work for these kinds of problems if you also supply an interval. – Szabolcs Mar 17 '13 at 0:47