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?
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.
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?
$\endgroup$
Check
for this message.
$\endgroup$
FindRoot[{f(x,y),g(x,y)},{x,x0},{y,y0}]
and I want that x>y
?
$\endgroup$
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.
Something like that works, more advanced answers should come from others.
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.
FindRoot
?
$\endgroup$
Reduce
will often work for these kinds of problems if you also supply an interval.
$\endgroup$
Select
the solutions given byFindRoot
. $\endgroup$Cases[FindRoot[...],Rule[_,_>0]..&&Rule[_,_<1]..
(I'm not sure whether thepattern
is the best to filter solutions). $\endgroup$