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) # ###########################################################################