Re: clarification. Re: one liner for a function?
- To: mathgroup at smc.vnet.net
- Subject: [mg46070] Re: clarification. Re: one liner for a function?
- From: sean_incali at yahoo.com (sean kim)
- Date: Thu, 5 Feb 2004 04:02:50 -0500 (EST)
- References: <bvg11r$qn6$1@smc.vnet.net> <bvl8r0$t4j$1@smc.vnet.net> <bvnmiu$ha4$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Thank you very much Peltio. I'm new to this funtional programming idea. and i have heard that writing pure functions make things go faster. so I have been trying to think of things in terms of funtions. it's not easy but i think im making a progress. thanks so much for the codes. sean "Peltio" <peltio at twilight.zone> wrote in message news:<bvnmiu$ha4$1 at smc.vnet.net>... > >You might also want to modify > >the line > > newli = li /. (_ -> v_) -> fun[v]; > >to make it look like something like > > newli = li /. (a_ -> v_) -> Set[buildname[a],fun[v]]; > > It is possible to generalize the procedure ToValues in such a way that you > can get what you want in this way: > > sol= NDSolve[{ > a'[t]==-0.1a[t] x[t], b'[t]==-0.05b[t] y[t], > x'[t]==-0.1a[t] x[t]+0.05b[t] y[t], y'[t]==0.1a[t] x[t]-0.05b[t] > y[t], > a[0]==1, b[0]==1, x[0]==1, y[0]==0}, > {a,b,x,y},{t,0,250}]; > > (note that we are assigning the 'raw' list of solutions to ToValues). > This will plot the graph of the solution, labeling it with the variable's > name. > > makePlots[name_][f_] := Plot[f[t], {t, 0, 250}, > DisplayFunction ->Identity,PlotRange -> All, Frame -> True, > FrameLabel -> {"t",ToString[name]}]; > > We can map this function on the list of rules given by NDSolve. Using > ToValues it is possible no to care about the nesting > > Show[GraphicsArray[ > Partition[ToValues[sols, makePlots, IndexedFunction -> True], 2] > ]] > > > And if you still want to assign the plots to variables with names linked to > the name of the function you can use the following functions: > plotName[nm_] := ToExpression[StringJoin["p", ToString[nm]]] > setPlots[nm_][f_] := Evaluate[plotName[nm]] = Plot[f[t], {t, 0,250}, > DisplayFunction -> Identity, PlotRange -> All, Frame -> True]; > We can use ToValues to extract the solutions from the list given by NDSolve > and apply to them the setPlots function, in order to have plots assinged to > separate variables. Do not evaluate this command twice unless you have > cleared the variables used. > Show[GraphicsArray[ > Partition[ToValues[sols, setPlots, IndexedFunction -> True], 2] > ]] > The individual plots are now assigned, as you initially asked, to the > variables whose names are in the form 'p+name of the function'. Remember > that you'd have to force their visualization by setting the proper option in > Show. > Show[py, DisplayFunction -> $DisplayFunction] > > cheers, > Peltio > and you need the following generalized version of ToValues to do the above > (a properly placed subtitution with pure functions will do as well, but... I > have this hammer now and everything resembles a nail : ) ): > > (* ToValues code follows ==================== *) > > ToValues::usage = "ToValues[li] suppresses the Rule wrapper in every part of > the list li.\n ToValues[li,F] applies the function F to every rhs of Rule, > turning var->value into F[value]. If the function F has a parametrized head, > then it is possible to pass to it the lhs of Rule by setting the option > IndexedFunction->True. It will turn var->value into F[var][value].\n > When the option Flattening is set to Automatic, ToValues flattens li in > order to simplify its structure (the flattening is tuned to get the > simplest list of values for the solution of a system of several equation > in several variables). With Flattening set to None the original structure > is left intact."; > > Options[ToValues] = {Flattening -> Automatic, IndexedFunction -> False}; > > ToValues[li_, opts___Rule] := Module[ > {newli, vars, sols, fl}, > fl = Flattening /. {opts} /. Options[ToValues]; > sols = First[Dimensions[li]]; vars = Last[Dimensions[li]]; > newli = li /. (_ -> v_) -> v; > If[fl == Automatic && vars == 1, newli = Flatten[newli]]; > If[fl == Automatic && sols == 1, First[newli], newli] > ] > > ToValues[li_, fun_, opts___Rule] := Module[ > {newli, vars, sols, foo, mi}, > mi = IndexedFunction /. {opts} /. Options[ToValues]; > fl = Flattening /. {opts} /. Options[ToValues]; > If[mi == True, > newli = li /. (x_ -> v_) -> foo[x][v], > newli = li /. (_ -> v_) -> foo[v] > ]; > sols = First[Dimensions[li]]; vars = Last[Dimensions[li]]; > If[fl == Automatic && vars == 1, newli = Flatten[newli]]; > If[fl == Automatic && sols == 1, First[newli], newli] //. foo -> fun > ] > > (* end of code ============================ *) > An example of application: > > cmplxToVec[z_]:={Line[{#,{0,0}}],PointSize[.018],Point[#]}&/@{{Re[z],Im[z]}} > > vecs=ToValues[Solve[x^9==1,x], cmplxToVec ]; > Show[Graphics[vecs], AspectRatio->1,Frame->True,Axes->True];