MathGroup Archive 2004

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

Search the Archive

Re: Re: FindRoot cannot find obvious solution

  • To: mathgroup at smc.vnet.net
  • Subject: [mg47896] Re: [mg47867] Re: FindRoot cannot find obvious solution
  • From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
  • Date: Thu, 29 Apr 2004 19:39:43 -0400 (EDT)
  • References: <200404270847.EAA18892@smc.vnet.net> <c6o3lc$cd0$1@smc.vnet.net> <200404290705.DAA28269@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

On 29 Apr 2004, at 16:05, Maxim wrote:

> I think that with all these nice workarounds it went unnoticed that
> there *was* something wrong with Mukhtar's example. Consider:
>
> In[1]:=
> Module[
>   {y = Cos[x], f},
>   f[x_] := y;
>   FindRoot[f[x], {x, 1, 2},
>     Compiled -> True, MaxIterations -> 15,
>     StepMonitor :> Print["step: ", {x, f[x]}]]
> ]
>
> Out[1]=
> {x -> 1.5708}
>
> In[2]:=
> Module[
>   {y = Cos[x], f},
>   f[x_?NumericQ] := y;
>   FindRoot[f[x], {x, 1, 2},
>     Compiled -> True, MaxIterations -> 15,
>     StepMonitor :> Print["step: ", {x, f[x]}],
>     EvaluationMonitor -> 0]
> ]
>
>
> FindRoot::cvmit: Failed to converge to the requested
>     accuracy or precision within 15 iterations.
>
> Out[2]=
> {x -> 2.}
>
> This is similar to the issue that was discussed at
>
> http://forums.wolfram.com/mathgroup/archive/2003/Dec/msg00401.html
>
> Just as with the Plot examples, f[1] here is not numerical because x
> in Cos[x] will remain unbound. But if we evaluate Block[{x=1}, f[x]],
> then the result will be numerical, and this is how FindRoot works. And
> then there's the question of how it will interact with Compiled->True.
>
> But here we have a new twist, because, according to Trace, FindRoot
> does obtain numerical values evaluating f[x] in both cases, so it's
> not clear what happens in the second example, when we use
> f[x_?NumericQ].
>
> Oh, and EvaluationMonitor/StepMonitor won't help us here, because they
> perform true delayed evaluation, while what FindRoot seems to do is to
> evaluate the first argument once and then to perform all computations
> on what it obtains (why does it have HoldAll attribute then? Simple:
> to add extra confusion if FindRoot is used inside Module or With and
> there is a name conflict). As an additional bonus, if you omit
> EvaluationMonitor in the second example, then StepMonitor won't print
> anything either. Lovely.
>
> Maxim Rytin
> m.r at prontomail.com
>
>
>

I really fail to see what point are you trying to make? Certainly, your 
use of Module has nothing to do with the problem which is entirely due 
to the setting Compile->True. If you set Compile->False, which is only 
natural since the function defined in this way obviously can't be 
compiled, then everything, including StepMonitor works exactly as it 
should. Why on earth you keep insisting that Mathematica should behave 
correctly when you give her nonsensical input to work on?


y = Cos[x];
f[(z_)?NumericQ] := y;
FindRoot[f[x], {x, 1, 2}, Compiled -> False,
   MaxIterations -> 15, StepMonitor :>
    Print["step: ", {x, f[x]}]]


"step: "{2., -0.4161468365471424}


"step: "{1.5649043758915777, 0.005891916813448233}


"step: "{1.570978574535018, -0.00018224773911250164}


"step: "{1.570796325773051, 1.0218455583390503*^-9}


"step: "{1.5707963267948966, 6.123233995736766*^-17}


{x -> 1.5707963267948966}


Andrzej Kozlowski
Chiba, Japan
http://www.mimuw.edu.pl/~akoz/


  • Prev by Date: Re: The Wave Equation : Mathematica vs. Mathworld
  • Next by Date: understanding Complement
  • Previous by thread: Re: FindRoot cannot find obvious solution
  • Next by thread: Re: FindRoot cannot find obvious solution