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}
*)