Wagner's trick to monitor FindRoot no longer works in Mathematica version 8
Try the Evaluated -> False
option:
FindRoot[Print[x]; Sin[x] - Cos[x], {x, .5}, Evaluated -> False]
During evaluation of In[3]:= 0.5
During evaluation of In[3]:= 0.5
During evaluation of In[3]:= 0.5
During evaluation of In[3]:= 0.793408
During evaluation of In[3]:= 0.793408
During evaluation of In[3]:= 0.793408
During evaluation of In[3]:= 0.785398
During evaluation of In[3]:= 0.785398
During evaluation of In[3]:= 0.785398
During evaluation of In[3]:= 0.785398
During evaluation of In[3]:= 0.785398
During evaluation of In[3]:= 0.785398
Out[3]= {x -> 0.785398}
As to the Plot
, try
Plot[Print[x]; Sin[x], {x, Pi/4, Pi/2}, Evaluated -> True];
During evaluation of In[5]:= x
As you see, the behavior is exactly the same as it is for FindRoot
by default. The difference in default behavior can be explained by default values of the Evaluated
option:
Options[#, Evaluated] & /@ {Plot, FindRoot}
{{Evaluated -> Automatic}, {Evaluated -> True}}
It seems that the Automatic
value is equivalent to False
in this case.
Another approach
As Albert Retey mentioned in the comment, the "standard" (and documented) way to monitor evaluations is to define objective function as black-box function by restricting its argument to numerical values only:
In[1]:= f[x_?NumericQ] := (Print[x]; Sin[x] - Cos[x])
FindRoot[f[x], {x, .5}]
During evaluation of In[1]:= 0.5
During evaluation of In[1]:= 0.5
During evaluation of In[1]:= 0.5
During evaluation of In[1]:= 0.793408
During evaluation of In[1]:= 0.793408
During evaluation of In[1]:= 0.793408
During evaluation of In[1]:= 0.785398
During evaluation of In[1]:= 0.785398
During evaluation of In[1]:= 0.785398
During evaluation of In[1]:= 0.785398
During evaluation of In[1]:= 0.785398
During evaluation of In[1]:= 0.785398
Out[2]= {x -> 0.785398}
Additional comparisons
Here I switch off autocompilation for not loading the corresponding package (it affects output of Trace
):
In[1]:= ClearAll[f, x]; f[x_] := x - 1;
Trace[FindRoot[f[x], {x, .5}, Evaluated -> False, Compiled -> False],
TraceInternal -> True] // LeafCount
Trace[FindRoot[f[x], {x, .5}, Evaluated -> True, Compiled -> False],
TraceInternal -> True] // LeafCount
Out[2]= 181
Out[3]= 111
In[4]:= ClearAll[f, x]; f[x_?NumericQ] := x - 1;
Trace[FindRoot[f[x], {x, .5}, Evaluated -> False, Compiled -> False],
TraceInternal -> True] // LeafCount
Trace[FindRoot[f[x], {x, .5}, Evaluated -> True, Compiled -> False],
TraceInternal -> True] // LeafCount
Out[5]= 217
Out[6]= 261
One can see that in simple cases the option Evaluated -> True
reduces number of evaluations but in more complicated cases (black-box function) it cannot help.
First, it's probably worth adding to @Rojo's comment that EvaluationMonitor
was introduced in V5, so that the functionality of Wagner's code can be achieved with
FindRoot[Sin[x] - Cos[x], {x, .5}, EvaluationMonitor :> Print[x]]
Second, note that using Evaluated -> False
or ?NumericQ
prevents symbolic analysis of the function and prevents FindRoot
from choosing Newton's method, as is done in Wagner's book. In his book, the output of Print
is
x
0.5
0.793408
0.785398
0.785398
To get the essential part of Wagner's output with Evaluated -> False
or a ?NumericQ
function supply the Jacobian
:
FindRoot[Print[x]; Sin[x] - Cos[x], {x, .5}, Evaluated -> False,
Jacobian -> D[{Sin[x] - Cos[x]}, {{x}}]]
(*
0.5
0.793408
0.785398
0.785398
{x -> 0.785398}
*)
Note the initial x
is missing, but otherwise the steps are the same.
Just because I like generalizing processes: Here's a generic wrapper, with a debugging hook debug
that can be set to Print
temporarily with Block
.
ClearAll[dbFunc];
f[x_] := Sin[x] - Cos[x];
dbFunc[f_][x_?NumericQ] := (debug[x]; f[x]);
Derivative[1][dbFunc[f_]][x_] := f'[x]; (* need to Clear[Derivative] to undo this def *)
Block[{debug = Print},
FindRoot[dbFunc[f][x], {x, .5}]
]
(*
0.5
0.793408
0.785398
0.785398
{x -> 0.785398}
*)