Re: one liner for a function?
- To: mathgroup at smc.vnet.net
- Subject: [mg45978] Re: one liner for a function?
- From: drbob at bigfoot.com (Bobby R. Treat)
- Date: Sat, 31 Jan 2004 05:20:45 -0500 (EST)
- References: <bvd9f8$5k1$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
How's this? sol = First@ NDSolve[{a'[ t] == -0.1` a[t] x[t], b'[t] == -0.05` b[t] y[t], x'[t] == -0.1` a[t] x[t] + 0.05` b[t] y[t], y'[t] == 0.1` a[t] x[t] - 0.05` b[t] y[t], a[0] == 1, b[0] == 1, x[0] == 1, y[0] == 0}, {a, b, x, y}, {t, 0, 250}]; Show[GraphicsArray[ Map[Plot[#[t] /. sol, {t, 0, 250}, DisplayFunction -> Identity, PlotRange -> All, PlotLabel -> #] &, {{a, b}, {x, y}}, {-1}]], ImageSize -> 500] The level specification for Map could be {2} rather than {-1} just as well. {2} means all elements at level two, while {-1} means all leaf nodes and, for the matrix {{a,b},{x,y}}, the two are the same thing. In either case, a pure function (Plot[...]&) is mapped onto those elements of the matrix producing a matrix of Graphics objects, and that's the input GraphicsArray needs. Here's another solution for which the level specification can't be {-1}. Notice the labels are different. sol = First@ NDSolve[{a'[ t] == -0.1` a[t] x[t], b'[t] == -0.05` b[t] y[t], x'[t] == -0.1` a[t] x[t] + 0.05` b[t] y[t], y'[t] == 0.1` a[t] x[t] - 0.05` b[t] y[t], a[0] == 1, b[0] == 1, x[0] == 1, y[0] == 0}, {a[t], b[t], x[t], y[t]}, {t, 0, 250}]; Show[GraphicsArray[Map[Plot[# /. sol, {t, 0, 250}, DisplayFunction -> Identity, PlotRange -> All, PlotLabel -> #] &, {{a[t], b[t]}, {x[t], y[ t]}}, {2}]], ImageSize -> 500] And this combines sol from the second solution with Show from the first: sol = First@ NDSolve[{a'[ t] == -0.1` a[t] x[t], b'[t] == -0.05` b[t] y[t], x'[t] == -0.1` a[t] x[t] + 0.05` b[t] y[t], y'[t] == 0.1` a[t] x[t] - 0.05` b[t] y[t], a[0] == 1, b[0] == 1, x[0] == 1, y[0] == 0}, {a[t], b[t], x[t], y[t]}, {t, 0, 250}]; Show[GraphicsArray[Map[Plot[#[t] /. sol, {t, 0, 250}, DisplayFunction -> Identity, PlotRange -> All, PlotLabel -> #] &, {{a, b}, {x, y}}, { 2}]], ImageSize -> 500] Bobby sean_incali at yahoo.com (sean kim) wrote in message news:<bvd9f8$5k1$1 at smc.vnet.net>... > I have been asking questions for three straight night in a row... > > I appreciate all the replies. > > I have another couple of questions tonight. > > 1. let's say you have to make GraphicsArray using the interpolating > functions. > I have managed to write a function that automates the plotting part, > but i haven't been able to write one that will automate plotting and > naming the plot object and showing in a graphics array. > > as an example, > > sol= NDSolve[{a'[t]==-0.1` a[t] x[t], b'[t]==-0.05` b[t] y[t], > x'[t]==-0.1` a[t] x[t]+0.05` b[t] y[t], > y'[t]==0.1` a[t] x[t]-0.05` b[t] y[t], a[0]==1, b[0]==1, > x[0]==1, > y[0]==0}, {a,b,x,y},{t,0,250}][[1]]; > > pfunc[name_]:= Plot[Evaluate[{name[t]/. sol}, {t, 0, 250}], > PlotRange-> All, DisplayFunction -> Identity, PlotLabel -> name]; > > pa = pfunc[a]; > pb = pfunc[b]; > px = pfunc[x]; > py = pfunc[y]; > > Show[GraphicsArray [{{pa, pb}, {px, py}}], ImageSize-> 500] > > > funtion I wrote called "pfunc" does fine, but i was wondering is there > a way to automate the > > pa = pfunc[a]; ... py = pfunc[y]; > > and > > Show[GraphicsArray [{{pa, pb}, {px, py}}], ImageSize-> 500] > > part also? > > I can't seem to figure out a way to take the output of function to > make another function.. and that seems to me what i have to do.. ( i > don't even know that make sense to you guys...) > > > 2. once you have everythign in function form, can you write it in one > liner format? ( perhaps with some explanations? ) > > as always any and all thoughts and replies are thoroughly appreciated. > > thanks all in advance. > > sean