Re: Indexed variables
- To: mathgroup at smc.vnet.net
- Subject: [mg24702] Re: Indexed variables
- From: Hartmut Wolf <hwolf at debis.com>
- Date: Fri, 4 Aug 2000 01:19:27 -0400 (EDT)
- Organization: debis Systemhaus
- References: <8lsup5$26a@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Barbara Da Vinci schrieb:
>
> Hello, MathGroup
> Is there anybody who knows as to thrust indexed
> variables in Mathematica without assigning them a
> value ? I need a[[1]] ... a[[8]] to be real headed
> expressions (variables, if you like) present in some
> equations as unknowns.
> I tried a=Table[0,{k,1,8}] but it hampers me because
> of zero value.
Ciao Barbara,
it's not clear to me what you what to achieve, perhaps the following might be
overly complex, yet I hope to give you some help.
(1) First, although you could define
In[1001]:= s /: Head[s] = Real
for a symbol s, but then f[s] still won't match a definition for _Real
In[1002]:= f[_Real] := "real argument"
In[1003]:= f[_?NumberQ] := "numeric argument"
In[1004]:= f[_Symbol] := "symbol as argument"
In[1005]:= f[_] := "something different"
In[1006]:= f[s]
Out[1006]= "symbol as argument"
However if you define
In[1007]:= s /: NumberQ[s] = True
then
In[1008]:= f[s]
Out[1008]= "numeric argument"
So you have to set up your definitions accordingly.
(2) Second, expressions like a[[1]] cannot be made to variables in the sense of
Mathematica symbols (although in some circumstances, e.g. with differentiation,
the may appear as variables in a mathematical sense).
However, you may make the expressions a[[1]], etc. refer to symbols.
In[2001]:= a = Table[ToExpression["a" <> ToString[i]], {i, 8}]
Out[2001]= {a1, a2, a3, a4, a5, a6, a7, a8}
In many circumstances you can just use a[[i]]. But if you want to assign a value
to the variable, e.g. referred by a[[5]], then you have to evaluate the lhs of
Set (else the value would be assigned to a[[5]] itself, not to the referred a5.
In[2002]:= {Evaluate[a[[5]]] = Pi, a5}
Out[2002]= {\[Pi], \[Pi]}
Yet you can't repeat the game
In[2003]:= {Evaluate[a[[5]]] = 2 Pi, a5}
>From In[2003]:=
Set::"wrsym": "Symbol \!\(\[Pi]\) is Protected."
Out[2003]= {2 \[Pi], \[Pi]}
On meta-level programming however you still can redefine a5 (with programmed
indexed reference):
In[2004]:= i = 5;
{ToExpression[RowBox[{"a" <> ToString[i], "=", "4 Pi"}]], a5}
Out[2004]= {4 \[Pi], 4 \[Pi]}
In[2005]:= Clear[a]
(3) Perhaps a pretty way would be to use the Notation package and work with
subscripted expressions (which *can* be made to symbols)
In[2]:= << Utilities`Notation`
In[3]:= On[General::"newsym"]
In[4]:= Off[General::"stop", General::"spell1"]
If you now want to Symbolize expressions a\_i in a programmed fashion, you also
have to do that at meta-level:
In[6]:=
Do[Symbolize[
ToExpression[
TagBox[SubscriptBox["a", ToString[j]], NotationBoxTag,
TagStyle -> "NotationTemplateStyle"]]], {j, 1, 8}]
>From In[6]:= General::"newsym": "Symbol
\!\(a\[UnderBracket]Subscript\[UnderBracket]1\) is new."
... et cetera, until ...
>From In[6]:= General::"newsym": "Symbol
\!\(a\[UnderBracket]Subscript\[UnderBracket]8\) is new."
The a\[UnderBracket]Subscript\[UnderBracket]1 etc. are then the "real" symbols
(which are referred to by a\_1 i.e. Subscript[a,1] etc.)
Define the upvalues:
In[10]:=
Do[With[{sym = ToExpression[SubscriptBox["a", ToString[j]]]},
TagSet[sym, NumberQ[sym], True]], {j, 1, 8}]
Test:
In[11]:= \!\(NumberQ\ /@ \ {a\_7, a\_8, a\_9, a\_10}\)
>From In[11]:= General::"newsym": "Symbol \!\(a\) is new."
Out[11]= {True, True, False, False}
You see, here it was only the reference to Subscript[a,9] -- which had not been
set up as a symbol -- that generated the symbol a.
Now, like before, you could define
In[12]:=
a = Table[ToExpression[SubscriptBox["a", ToString[j]]], {j, 1, 8}]
Out[12]=
\!\({a\_1, a\_2, a\_3, a\_4, a\_5, a\_6, a\_7, a\_8}\)
and work through a[[i]]
In[13]:= \!\({Evaluate[a[\([5]\)]] = Pi, a\_5}\)
Out[13]= {\[Pi], \[Pi]}
(To input line 13 write "{Evaluate[a[[5]] = Pi, [#]}" and at the place indicated
here by "[#]" input subscripted a through the palette)
Kind regards,
Hartmut Wolf