Re: Why doesn't this work?
- To: mathgroup at smc.vnet.net
- Subject: [mg20529] Re: [mg20352] Why doesn't this work?
- From: "Peter Weijnitz" <peter.weijnitz at perimed.se>
- Date: Sat, 30 Oct 1999 00:13:50 -0400
- References: <7ubmdi$sk4@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
But it does work!
I tried it as you your first example and it worked fine?
(I use Mathematica 3.01 on nt4 ) {t->18.1648}
David Withoff skrev i meddelandet <7ubmdi$sk4 at smc.vnet.net>...
>> 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
>>
>> ,------------------------------------------------------------------.
>> | 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
>
>The first argument in FindRoot is expected to be an equation (an
>expression of the form lhs==rhs):
>
>In[1]:= ?FindRoot
>FindRoot[lhs==rhs, {x, x0}] searches for a numerical solution to the
equation
> lhs==rhs, starting with x=x0.
>
>The expression
>
> (Dog[t]==0) /. { tau1->13.7, tau2->24.8}
>
>is not an equation. It contains an equation, and if it is evaluated
>in a particular way (before FindRoot assigns a numerical value to t)
>it will evaluate to an equation, but that's not quite good enough.
>
>In most cases the best solution is to follow the documentation and
>enter something that is actually an equation, as in your second example.
>
>Another possibility is to force the evaluation to be done in a way
>that leads to an equation, such as
>
>In[2]:= Dog[t_] := (t/tau1)^6 Exp[-6 (t/tau1 - 1)] -
> (t/tau2)^6 Exp[-6 (t/tau2 - 1)]
>
>In[3]:= FindRoot[Evaluate[(Dog[t]==0) /. { tau1->13.7, tau2->24.8}], {t,
20}]
>
>Out[3]= {t -> 18.1648}
>
>or
>
>In[4]:= With[{eq = (Dog[t]==0) /. { tau1->13.7, tau2->24.8}},
> FindRoot[eq, {t, 20}]]
>
>Out[4]= {t -> 18.1648}
>
>Dave Withoff
>Wolfram Research
>