MathGroup Archive 2007

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

Search the Archive

Re: Replace in Modules

  • To: mathgroup at smc.vnet.net
  • Subject: [mg81222] Re: Replace in Modules
  • From: Szabolcs Horvát <szhorvat at gmail.com>
  • Date: Sun, 16 Sep 2007 04:06:26 -0400 (EDT)
  • References: <fcg3t2$rcr$1@smc.vnet.net>

Joerg Schaber wrote:
> Hi,
> 
> why doesn't the following give me the square root?
> 
> f[x_] := Module[{a, y},y = x;Return[FindRoot[y == a^2, {a, 1}]]]
> 
> f[z] /. {z -> 2}
> 
> where as
> 
> f[x_] := Module[{a},Return[FindRoot[x == a^2, {a, 1}]]]
> 
> f[z] /. {z -> 2}
> 
> works fine?

No, it does not work fine.  It gives lots of errors that you must not 
ignore. If you just evaluate f[z], you get something similar to

FindRoot[y$66 == a$66^2, {a$66, 1}]

in the first case, and

FindRoot[z == a$176^2, {a$176, 1}]

in the second case. (And of course, lots of error messages.)

These are the partial results ReplaceAll operates on when you type f[z] 
/. z->2 .  Only the second one has 'z'.  But why isn't 'y' replaced by 
'z' in the first example?

In := Attributes[FindRoot]
Out = {HoldAll, Protected}

Because FindRoot has HoldAll, i.e. it processes its arguments unevaluated.

 From this we can conclude that using Module is not strictly necessary 
here (but it may be useful if we put other function than FindRoot in the 
module).  Using Return is redundant.  The value of the last expression 
in a CompoundExpression is always returned.

Now, what should we do about the error messages that f[z] gave?

In := f[z]

FindRoot::nlnum: The function value {-1.+z} is not a list of numbers 
with dimensions {1} at {a$176} = {1.}. >>
FindRoot::nlnum: The function value {-1.+z} is not a list of numbers 
with dimensions {1} at {a$176} = {1.}. >>
FindRoot::nlnum: The function value {-1.+z} is not a list of numbers 
with dimensions {1} at {a$176} = {1.}. >>
General::stop: Further output of FindRoot::nlnum will be suppressed 
during this calculation. >>

Of course, FindRoot[z == a^2, {a, 1}] does not work if 'z' is a 
non-numerical quantity, so we change the definition of 'f' in a way that 
f[z] will only evaluate if 'z' is a number:

Clear[f]
f[z_?NumericQ] := FindRoot[z == a^2, {a, 1}]

Since you used Module, you probably wanted something like this:
f[z_?NumericQ] := Module[{a}, a /. FindRoot[z == a^2, {a, 1}]]

I hope this helps,
Szabolcs


  • Prev by Date: Re: Re: rationalize numerator of quotient
  • Next by Date: RE: Legend on BarChart
  • Previous by thread: Re: Replace in Modules
  • Next by thread: Re: Replace in Modules