RE: Finding variables in a very long expression (corrected)
- To: mathgroup at smc.vnet.net
- Subject: [mg31409] RE: Finding variables in a very long expression (corrected)
- From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
- Date: Sat, 3 Nov 2001 05:29:15 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
> Yesterday I replied to Jose Flanigan's question about
> how to find all variables in an expression.
> In that reply I wrote ....
> -------------
> > Consider expr below.
> >
> > In[1]:=
> > expr=Sqrt[x*y]+x*z+w Sqrt[x]z^(1/n)+Pi/3;
> > w=v;
> >
> > The simple line below almost works, but the list includes
> > Pi which isn't a variable. The third argument of Cases
> > here is a level specification. You can read about Cases
> > and level specification at my web site (URL below).
> >
> > In[3]:=
> > Union[Cases[expr, _Symbol, {0, -1}]]
> >
> > Out[3]=
> > {n, Pi, v, x, y, z}
> >
> >
> > The next line eliminates symbols such as Pi.
> >
> > In[4]:=
> > Union[Cases[expr, _Symbol?( !NumericQ[#]& ), {0, -1} ]]
> >
> > Out[4]=
> > {n, v, x, y, z}
> >
> > --- The Plot Thickens ---
> > At the 1999 Developer Conference Robby Villegas explained
> > that this sort of thing gets tricky when you are working
> > with symbols that were previously removed. Consider the
> > lines below where the symbol (v) is removed. If I had my
> > way removing a symbol would make the kernel work as if the
> > symbol never had any values, but that's not the way it works.
> >
> > In[5]:=
> > Remove[v]
> >
> > In[6]:=
> > Union[Cases[expr, _Symbol?( !NumericQ[#]& ), {0, -1} ]]
> >
> > Out[6]=
> > {n, Removed[v], x, y, z}
> >
> >
> > If you want to make sure your list of variables is free of
> > Removed Symbols use the next line (based on Robby Villegas talk).
> >
> > In[7]:=
> > Union[Cases[expr, _Symbol?
> > ( !NumericQ[#] && NameQ[ToString[#]]& ), {0, -1}
> > ]]
> >
> > Out[7]=
> > {b, x, y, z}
> >
> >
> -----------------------
> However in the the next example the approach used
> above doesn't find the symbols (f) and (g).
>
> In[1]:= expr=D[ x^3+f[x]+g'[x]+Abs[x], x];
>
>
> In[2]:= Union[Cases[expr, _Symbol?(!NumericQ[#]&), {0,-1} ] ]
>
> Out[2]= {x}
>
>
> The next line returns a list of symbols we are differentiating.
> This line really demontrates how versitle Cases[..] can be. You
> could use Union on the result to elliminate duplicates if there
> are any.
>
> In[3]:= Cases[expr, Derivative[_][func_]:>func, {0,-1}, Heads->True]
>
> Out[3]= {Abs, f, g}
>
>
> -----------
> The next few lines give another approach. In the first line below
> I don't bother to ensure I only get non-numeric symbols because
> symbols such as Pi will be discarded with my last step.
>
> In[4]:= lst=Union[ Cases[expr, _Symbol, {0,-1}, Heads->True] ]
>
> Out[4]= {Abs, Derivative, f, g, Plus, Power, Times, x}
>
>
> You probably only want the user symbols {f, g, x}.
> The code below will take care of that.
>
> In[5]:= MyVariables=Names["Global`*"];
> Select[lst, MemberQ[MyVariables, ToString[#] ]& ]
>
> Out[5]:= {f, g, x}
>
>
> You could if you want use this last step on the list
> {Abs, f, g} above if you prefer that approach and want
> to get rid of (Abs). In todays post I don't bother to
> ensure Removed symbols are discarded, but you can do
> that if you wish.
> -------
>
> Regards,
> Ted Ersek
> Check Mathematica Tips, Tricks at
> http://www.verbeia.com/mathematica/tips/Tricks.html
>