Re: Using a variable set elsewhere within Manipulate
- To: mathgroup at smc.vnet.net
- Subject: [mg98159] Re: Using a variable set elsewhere within Manipulate
- From: Daan Gerla <daan at gerla.nl>
- Date: Wed, 1 Apr 2009 05:54:33 -0500 (EST)
- Reply-to: daan at gerla.nl
Hello Mathematica users,
This message reports back on the answers I got on my previous message
"[mg98019] Using a variable set elsewhere within a function that has
attribute HoldAll", but where "HoldAll" got cut off from the subject line.
The problem was that I wanted to use a variable assigned to a
differential equation within Manipulate to dynamically solve it as a
parameter in the equation is tweaked. I want to the write the equation
outside of Manipulate and use it both within and outside of Manipulate,
without having to copy-paste it.
This does not work:
ode = x'[t] == r x[t] - x[t] ^2;
Manipulate[
sol = NDSolve[
{ode, x[0] == 0.1},
x,
{t, 0, 10}
];
Plot[x[t] /. sol, {t, 0, 10}, PlotRange -> {0, 1}],
{r, 0.1, 1}]
First I thought it did not work because of the HoldAll attribute of
Manipulate, because I can get some similar bits of code working by
wrapping the first argument of Manipulate in Evaluate. For instance
x = y;
Manipulate[x, {y, 0, 1}]
does not work, but then
Manipulate[Evaluate[x], {y, 0, 1}]
does.
An easier way of understanding that the the dynamic ode solving above
does not work is by seeing that r in the assignment of ode is not the
same r as in the last argument of Manipulate. Two approaches were
suggested to me.
David (besides giving a nice example of how to use Dynamic instead of
Manipulate) made ode a function of r:
ode =.; sol =.
ode[r_] := x'[t] == r x[t] - x[t] ^2;
Manipulate[
sol = NDSolve[
{ode[s], x[0] == 0.1},
x,
{t, 0, 10}
];
Plot[x[t] /. sol, {t, 0, 10}, PlotRange -> {0, 1}],
{s, 0.1, 1}]
Jens used replacement:
ode =.; sol =.
ode = x'[t] == r x[t] - x[t] ^2;
Manipulate[
sol = NDSolve[
{ode /. r -> s, x[0] == 0.1},
x,
{t, 0, 10}
];
Plot[x[t] /. sol, {t, 0, 10}],
{s, 0.1, 1}]
Both work. However, the actual ODE's I want to solve involve many
parameters, all of which I want to manipulate. Writing ode1, ode2 etc.
as functions of the parameters doesn't look nice, so that is why I
prefer Jens' solution with replacement.
I am still looking for a nice way to get a list of rules set defined
elsewhere to work within Manipulate! ;-)
Thank you, David, Jens and Raffy.
Regards,
Daan