RE: Re: NonlinearRegress and numerical functions...
- To: mathgroup at smc.vnet.net
- Subject: [mg20190] RE: [mg20180] Re: [mg20132] NonlinearRegress and numerical functions...
- From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
- Date: Tue, 5 Oct 1999 04:04:20 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Larske Ragnarsson presented a problem about NonLinearRegression. In his
demonstration of the problem he used the following line.
In[25]:=
g1[t1_]:=y[t]/.DSolve[{y'[t]==-3*y[t],y[0]==6},y[t],t][[1]]/.
t->t1
The line above stores the following definition for (g1).
In[26]:=
??g1
Global`g1
g1[t1_]:=y[t]/.DSolve[{y'[t]==-3 y[t],y[o]==6},y[t],t][[1]]/.t->t1
-------------------------------
Bob Hanlon noted that the line above will solve the diff-eq each time
g1[_] is evaluated. Bob recommended the following line which will only
solve the diff-eq when the function is defined.
In[29]:=
g2[t1_]:=Evaluate[y[t]/.DSolve[{y'[t]==-3*y[t],y[0]==6},y[t],t][[1]]/.
t->t1]
In[31]:=
??g2
Global`g2
g2[t1_]:=6/E^(3*t1)
--------------------------------
I point out that the following line does the same thing and requires a
little less typing.
In[33]:=
g3[t1_]=y[t]/.DSolve[{y'[t]==-3*y[t],y[0]==6},y[t],t][[1]]/.
t->t1;
In[34]:=
??g3
Global`g3
g3[t1_]:=6/E^(3*t1)
--------------------------------
However, the previous two solutions don't store the intended solution if
(t1) happens to have a global value. It may be that the global value was
assigned early in a Mathematica session, and you have long since forgot
about it. Consider the examples below.
In[36]:=
Remove[g2,g3];
t1=7;
In[38]:=
g2[t1_]:=Evaluate[y[t]/.DSolve[{y'[t]==-3*y[t],y[0]==6},y[t],t][[1]]/.
t->t1]
In[39]:=
g2[a]
Out[39]=
6/E^21 (* Wrong Answer! *)
---------------------------------
In[40]:=
g3[t1_]=y[t]/.DSolve[{y'[t]==-3*y[t],y[0]==6},y[t],t][[1]]/.
t->t1;
In[41]:=
g3[b]
Out[41]=
6/E^21 (* Wrong Answer! *)
----------------------------------
You can solve the diff-eq only once, and ensure the intended definition is
stored by clearing global values from the symbol (t1) before the definition
is made. Of course (t1) better not have any values that you care about.
That is what I do below.
In[44]:=
Clear[t1];
g4[t1_]=y[t]/.DSolve[{y'[t]==-3*y[t],y[0]==6},y[t],t][[1]]/.
t->t1;
In[45]:=
??g4
Global`g2
g2[t1_]:=6/E^(3*t1)
-----------------------------
For another approach you can use a function in my (LocalPatterns.m) package.
With this package you can be sure the right definition is stored, and you
don't have to clear any definitions. You can download the package and a
notebook where it's demonstrated from
http://www.mathsource.com/cgi-bin/msitem?0210-609
------------------------------
Regards,
Ted Ersek
For Mathematica tips, tricks see
http://www.dot.net.au/~elisha/ersek/Tricks.html