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 recently learned that we can use Print as a monitoring tool. My favorite is Ted Ersek's example

h[f1[a1], f2[e][a2]] /. (a_ /; Print[a] :> 0)

which reveals the order in which ReplaceAll goes through parts of an expression. Clearly this is a very useful trick.

On page 41 of his book, David Wagner gave the example

FindRoot[Print[x]; Sin[x] - Cos[x], {x, .5}]

which prints the sequence of iterates generated by FindRoot along the way. That code no longer works on Mathematica version 8:

In[22]:= FindRoot[Print[x]; Sin[x] - Cos[x], {x, .5}]
During evaluation of In[22]:= x
Out[22]= {x -> 0.785398}

At first I thought this is related to the fact that we now have the EvaluationMonitor option, and FindRoot somehow weeds out superfluous subexpressions like Print. Now I know this is probably false because

Plot[Print[x]; Sin[x], {x, Pi/4, Pi/2}]

still lists all the points considered during its evaluation.

Why does FindRoot ignore Print?

share|improve this question
2  
I've learned recently that Plot, probably as well as FindRoot don't necessarily evaluate the whole first argument, as is, in every iteration. They sometimes partially evaluate first, and I am not sure in what cases. So you probably simply shouldn't put there what you want evaluated every time. Probably since EvaluationMonitor exists they have taken the liberty to put some optimizations in the expression preprocessing, where they felt like it. –  Rojo Jun 9 '12 at 3:00
add comment

1 Answer 1

up vote 18 down vote accepted

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.

share|improve this answer
    
Evaluated is not listed as one of the options for FindRoot in the documentation. What does it do? –  Michael Wijaya Jun 9 '12 at 6:58
5  
It controls whether the first argument will be evaluated before the moment when the local variable (in this case x) will have concrete value assigned. See this Mathgroups thread for more information. –  Alexey Popkov Jun 9 '12 at 7:03
6  
It probably should be mentioned that the "standard" trick to provide a function which only evalutes for numeric arguments (f[x_?NumericQ] := (Print[x]; Sin[x] - Cos[x])) will also do the trick without the need of the undocumented option. –  Albert Retey Jun 9 '12 at 9:31
    
It also works for Plot. Nice one! +1 –  Rojo Jun 9 '12 at 14:06
1  
@Michael This technique is demonstrated in the Documentation in few places, for example here. –  Alexey Popkov Jun 10 '12 at 8:01
show 9 more comments

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.