Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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?

share|improve this question
    
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). –  Sosi Mar 13 '13 at 14:50

3 Answers 3

up vote 3 down vote accepted

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[2]:= FindRoot[Sin[x], {x, 1, .1, 10}]

During evaluation of In[2]:= 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[2]= {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.

share|improve this answer
    
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? –  Fabrizio 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
1  
@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

Something like that works, more advanced answers should come from others.

f[x_] := Sin[x*10]

Mathematica graphics

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}

share|improve this answer

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.

share|improve this answer
    
But I need specifically FindRoot for solve my problem, and this doesn't work in that case. –  Fabrizio 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. –  Fabrizio 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

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.