Re: Why doesn't this work?

*To*: mathgroup at smc.vnet.net*Subject*: [mg20378] Re: [mg20352] Why doesn't this work?*From*: "Andrzej Kozlowski" <andrzej at tuins.ac.jp>*Date*: Sun, 17 Oct 1999 02:45:49 -0400*Sender*: owner-wri-mathgroup at wolfram.com

FindRoot has the HoldAll attribute. That means it does not evaluate its arguments before checking if they have the expected form. It expects the first argument to have the form eqn== something or, if it does not, then it interprets it as expr==0. For example, FindRoot[x^3-1,{x,2}] is the same as FindRoot[x^3-1==0,{x,2}]. There are two simple ways to get around this without using any temporary variable. The first is to wrap Evaluate around the first argument: In[1]:= Dog[t_] := (t/tau1)^6 * Exp[-6 * (t/tau1 - 1)] - (t/tau2)^6 * Exp[-6 * (t/tau2 - 1)] In[2]:= FindRoot[Evaluate[(Dog[t] == 0) /. {tau1 -> 13.7, tau2 -> 24.8}], {t, 20}] Out[2]= {t -> 18.1648} The second way is to omit == In[3]:= FindRoot[Dog[t] /. {tau1 -> 13.7, tau2 -> 24.8}, {t, 20}] Out[3]= {t -> 18.1648} - Andrzej Kozlowski Toyama International University JAPAN http://sigma.tuins.ac.jp http://eri2.tuins.ac.jp ---------- >From: Joe Strout <joe at strout.net> To: mathgroup at smc.vnet.net >To: mathgroup at smc.vnet.net >Subject: [mg20378] [mg20352] Why doesn't this work? >Date: Sat, Oct 16, 1999, 13:47 > > I'm trying to understand why a temporary is needed in the following > case. I've got a function of one parameter and two constants. I > define the constants on the fly with "/.". I want to find a root of > this equation. When I use "/." in FindRoot, it doesn't work, but if I > create another function that has these as true constants (rather than > symbols), FindRoot works. I don't understand why these two cases are > different. > > Here's my function (a difference of gaussians): > > Dog[t_] := (t/tau1)^6 * Exp[-6 * (t/tau1 - 1)] - (t/tau2)^6 * Exp[-6 * > (t/tau2 - 1)] > > Here's my first attempt to find a root, and the result: > > FindRoot[(Dog[t]==0) /. { tau1->13.7, tau2->24.8}, {t, 20}] > FindRoot::frnum: Function {False} is not a length 1 list of numbers at > {t} = {20.}. > > Here, I define a temporary function, and a FindRoot which should come > out to the exact same thing as above -- but this one works: > > Dog2[t_] = Dog[t] /. { tau1->13.7, tau2->24.8} > FindRoot[Dog2[t]==0, {t,20}] > {t->18.1648} > > Why is this? I've looked at it every way I can think of, thrown in > extra parens for grouping, checked that Dog2[t]==0 is exactly the same > as (Dog[t]==0) /. { tau1->13.7, tau2->24.8}, etc., but I can't figure > it out. Any clues? > > Thanks, > -- Joe > > P.S. How do I copy a notebook in plain text format? I tried "Copy As > > Plain Text" (and many others in that submenu) but it always gives me > text befuddled by lots of markup tags. I had to paste the above line > by line, and fix the "->" and "==" symbols which came through as > foreign characters. > > -- > ,------------------------------------------------------------------. > | Joseph J. Strout Biocomputing -- The Salk Institute | > | joe at strout.net http://www.strout.net | > `------------------------------------------------------------------' > Check out the Mac Web Directory! http://www.strout.net/macweb.cgi >