MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: FindRoot


Your answer pointed me to the explanation for the wrong behavior, which I think is a bug in Mathematica. The clue is that F[X/.X->XX] and F[X]/.X->XX give different answers and the reason is that Mathematica's internal representation of F[X] as an analytic function of X is wrong. In the definition of F[X], the roots of the cubic are first sorted, then the function returns the ratio of root #3 to root #2 (in my original example I meant to use root #1 instead of #2 but this doesn't matter for the purposes of debugging). Apparently, the analytic form of F[X] (i.e. what you get when you execute X =.; F[X]]) does not sort the roots and instead takes the ratio of the wrong pair. At least, that's what the demo below shows. 

With F[X /. X -> 0.3], F is evaluated according to its definition at a specified  numerical value of X  and returns the correct answer (a number). With F[X]/.X->.3 a different thing happens: first, the definition of F is executed for a symbolic X and returns a symbolic expression for F in terms of X, which however is wrong; then the analytic form is evaluated at the specified value of X.

The bottom line is this: F[X] is correct as long as X is a number; if it is an unevaluated symbol the answer is wrong. For this reason Plot, Table etc work but FindRoot, D, Integrate, etc do not. I would call this a bug in Mathematica since it produces an analytic expression for F that does not respect its definition and leads to apparent conflict between what should be equivalent representations, F[/.X->XX] and F[X]/.X->XX.  

ZEQ=-0.049973 p^2+(0.44137p-0.00873 p^2) z-z^2+z^3;

results=Append[results, Join[{XX}, roots, {F[XX], Re[F[X]/.X->XX]}]];
TableForm[results, TableHeadings->{None,{"XX", "z1", "z2", "z3","F[X]", "Re[F[X]/.X->XX]"}}]


  • Prev by Date: Re: Kolmogorov-Smirnov 2-sample test
  • Next by Date: Cases vs. StringCases vs. Select and StringMatchQ vs. StringFreeQ
  • Previous by thread: Re: FindRoot
  • Next by thread: Scoping constructs Block, Module, ModuleBlock violate principle of