Re: Protect a variable against being used as an iterator
- To: mathgroup at smc.vnet.net
- Subject: [mg116145] Re: Protect a variable against being used as an iterator
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Thu, 3 Feb 2011 05:31:21 -0500 (EST)
Your "exp" is inefficient, computing NDSolve all over again each time Plot
chooses a new t, even though sol[a] has not changed.
That's true for both plots.
To eliminate the error only (ignoring the inefficiency) is simple enough:
Clear[sol, exp]
tmin = 0;
tmax = 1;
sol[a_] :=
Block[{t}, NDSolve[{y'[t] == a y[t], y[0] == 1}, y, {t, tmin, tmax}]
]
exp[a_, t_] := y[t] /. sol[a]
Plot[exp[2, t], {t, tmin, tmax}] // Timing//Column
0.063649
(Module will also do, in place of Block.)
One way to speed things up is with memoization (dynamic programming):
Clear[sol]
sol[a_] :=
sol[a] = Block[{t},
NDSolve[{y'[t] == a y[t], y[0] == 1}, y, {t, tmin, tmax}]
]
Plot[exp[2, t], {t, tmin, tmax}] // Timing // Column
0.003212
For a simple differential equation like this one, we can solve for all a
at once:
Clear[y, t]
y[a_, t_] = y[t] /. First@DSolve[{y'[t] == a y[t], y[0] == 1}, y, t]
E^(a t)
Plot[y[2, t], {t, tmin, tmax}] // Timing // Column
0.001759
These differences in timing are not large, but for another problem they
could be.
Bobby
On Wed, 02 Feb 2011 05:09:05 -0600, Guido Walter Pettinari
<coccoinomane at gmail.com> wrote:
> Dear Mathematica group,
>
> I would like to ask you a simple question that, if answered, would
> make my life much easier :-)
>
> Does anybody know how to trigger a warning/error message whenever a
> particular symbol is used as an iterator? By iterator, I mean the
> second argument of functions like Plot, Table, Sum, i.e. the "i" in
> Table [ i^2, {i, 10} ]
>
> I am looking for this feature since I get errors/unmeaning results
> whenever I use as an iterator a variable already defined in some other
> part of the code (which I may have forgot of).
> E.g., this happens with NDSolve. Take the following example:
>
> tmin = 0;
> tmax = 1;
> sol[a_] := NDSolve [ {y'[t] == a y[t], y[0] == 1}, y, {t, tmin,
> tmax} ]
> exp[a_, t_] := y[t] /. sol[a]
>
> The following Plot command does not work:
> Plot[exp[2, t], {t, tmin, tmax}]
> while changing the iterator name works:
> Plot[exp[2, x], {x, tmin, tmax}]
>
> I know that (i) the first Plot command does not work because Plot
> (like Table and Sum) has the HoldAll attribute, and (ii) using the
> Evaluate function on exp[2, t] solves the problem.
>
> However, say that I publish a package that uses a variable in the same
> way I use "t" in the above example. How does the user of the package
> know that she should not use that variable to iterate? It would be
> nice if she gets a warning message whenever she tries to do so.
>
> I guess that a workaround would be to use a Unique[] symbol, either as
> an iterator or as, say, the NDSolve independent variable.... do you
> think this is doable?
>
> Thank you very much!
>
> Regards,
>
> Guido
>
--
DrMajorBob at yahoo.com