Re: NDSolve
- To: mathgroup at smc.vnet.net
- Subject: [mg8591] Re: [mg8536] NDSolve
- From: David Withoff <withoff>
- Date: Sun, 7 Sep 1997 22:13:10 -0400
- Sender: owner-wri-mathgroup at wolfram.com
> I wonder why the following did not work.
>
> NDSolve[{q'[k]==If[k==kss,qprimess,kdotfun/qdotfun],q[kss]=qss},...
> ***************
> The trouble is here.
>
> kdotfun and qdotfun are both defined previously as functions of [k].
> The error message was like
>
> ...does not evaluate at 34.5444 <-this is the value for kss ...
>
> When I just typed in the same function instead of using 'kdotfun/qdotfun',
> it worked. But I would rather not like to do it because the expression for
> it is sometimes quite complicated.
Probably the easiest way to get this to work is to use Evaluate
around the expression that is defined as a function of k, as in
In[1]:= kss = 1; qprimess = 1; kdotfun = k; qdotfun = 1; qss = 1;
General::spell1:
Possible spelling error: new symbol name "qdotfun"
is similar to existing symbol "kdotfun".
In[2]:= sol = NDSolve[{q'[k]==If[k==kss,qprimess,
Evaluate[kdotfun/qdotfun]],q[kss]==qss}, q, {k, 1, 2}]
Out[2]= {{q -> InterpolatingFunction[{{1., 2.}}, <>]}}
The NDSolve function does a limited form of variable localization,
which means among other things that the variable needs to appear
explicitly in the input to NDSolve.
> I have one more question.
> I Plot the InterpolatingFunction and want to mark a point of the line with
> * or else. Can I do this?
Yes, you can do this. One method is to use a graphics primitive to
put a mark at the point that you want. For example:
In[4]:= Show[g, Graphics[{PointSize[.02], Point[{1.6, q[1.6] /. sol[[1]]}]}]]
Out[4]= -Graphics-
Dave Withoff
Wolfram Research