index problem
- To: mathgroup at yoda.physics.unc.edu
- Subject: index problem
- From: rar at mail.physics.utah.edu (Rudolf A. Roemer)
- Date: Fri, 15 Apr 1994 10:22:23 -0700
Dear MMA group:
I thought the enclosed example regarding the pitfalls of "indexed functions"
(MMA-Bible p.211) might interest some of you.
As you know, MMA allows for the definition of indexed heads such as the
following list
In[25]:=
a[2] ={1., 1., 1.}
a[1] ={2., 2., 2.}
Out[25]=
{1., 1., 1.}
{2., 2., 2.}
Let's now define a function that does nothing but sum over this list. Since
we use this function with both lists, we use "Bpar" to be our index.
In[26]:=
trhoBE[x_,Bpar_]:=
Sum[
a[Bpar][[j]],
{j,1,Length[a[Bpar]]}
];
So, let's try this:
In[27]:=
trhoBE[x,2]
trhoBE[x,N[2]]
Out[27]=
3.
Out[28]=
2.
Oops, something went wrong, i.e., the index N[2] was not accepted. This is
clear, since in our definition (In[25]), we use the INTEGER "2" as the index
and not the REAL number "2.".
However, MMA sometimes does convert integers into reals apparently by
default as in the next example:
In[29]:=
NIntegrate[trhoBE[x,1/2], {x,.1,.9}]
NIntegrate[trhoBE[x,N[1/2]], {x,.1,.9}]
Out[29]=
0.4
Out[30]=
0.4
Note that both answers are WRONG. We expect 3 * (0.9 - 0.1) = 2.4.
In a piece of complicated code, it is extremely hard to nail a problem
down to this. Only when we put the function trhoBE[] into the integration
by hand, do we get the right result (and N[2] as index is wrong again,
although different from the above):
In[31]:=
NIntegrate[
Sum[
a[2][[j]],
{j,1,Length[a[2]]}
],
{x,.1,.9}
]
NIntegrate[
Sum[
a[N[2]][[j]],
{j,1,Length[a[N[2]]]}
],
{x,.1,.9}
]
Out[31]=
2.4 (* YES, that's RIGHT! *)
Out[32]=
1.6 (* WRONG again *)
Funny, isn't it?
-Rudo
###########################################################################
# Rudolf A. Roemer (RAR) Room: 306 James Fletcher Building #
# Department of Physics Email: rar at mail.physics.utah.edu #
# University of Utah FAX: USA (801) 581 4801 #
# Salt Lake City, Utah 84112 Phone: USA (801) 581 6424 #
# USA USA (801) 461 4450 (home) #
###########################################################################