Re: Modeling and Array Problem

• To: mathgroup at smc.vnet.net
• Subject: [mg58749] Re: Modeling and Array Problem
• From: "David Park" <djmp at earthlink.net>
• Date: Sun, 17 Jul 2005 03:04:01 -0400 (EDT)
• Sender: owner-wri-mathgroup at wolfram.com

```Peter,

array = {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}};

array[[1]][[1]]
1

But the following also works to get the element.

array[[1, 1]]
1

Often, just to be more clear and avoid all the double brackets, I use

Part[array, 1, 1]
1

Now, why doesn't the following work?

array[[1]][[1]] = 42

Because Mathematica takes the Head of the expression on the lhs and and sets
up an assignment to replace the first part. But the Head is array[[1]], not
array, and Mathematica expects a symbol here instead of the first row of the
array. On the other hand the following two methods will work.

array[[1, 1]] = 42

Part[array, 1, 1] = 42

In the list example the Head of the lhs side was a symbol, namely 'list'.

If you rewrite your code using Part or a single set of double brackets (they
are actually the same) and test each step

You could initialize and view your two data arrays with...

rprev = Table[{i, i^2}, {i, 0, 100}];
rprevb = Table[{i, 0}, {i, 0, 100}];
ListPlot[rprev, Frame -> True];
ListPlot[rprevb, Frame -> True];

Then in your definition of iter you must remember that array positions start
at 1. But in your use of iter you are starting at 0 and you can't have
position 0 in an array. You also have to be careful of how iter works on the
high end. I think you will always be losing places at the high end of the
curve. (I think maybe you could use the ListConvolve command with this but
I'm not too familiar with it. Just for learning you might continue with your
present approach.)

Do not try to do everything at once. First try...

Do[Part[rprevb, j + 1, 2] = iter[j], {j, 1, 99, 1}]
ListPlot[rprevb,Frame];

You will see that this does not work if you start at j = 0. Starting at j =
1 it appears to work.

Once you get one iteration working, then put together the series.

Maybe that will help some.

David Park

From: Sycamor at gmail.com [mailto:Sycamor at gmail.com]
To: mathgroup at smc.vnet.net

Hello,

I am a high school student and am interning/volunteering at a
university over the summer.  My ultimate goal is to model the movement
of charge in a Nickel Metal Hydride Sphere using Mathematica.  This
goal is beyond my ability as it requires calculus and differential
equations and so forth.  But I am to progress as best I can, using
iterative processes to replace calculus where possible.  The professor
I am working with has started me with the simpler task of finding the
curvature of a set of data points (in this first easy case, the 'data'
is the values of 101 points of the x^2 function).

While programming, I have found it necessary to change the value of
certain elements of an array of ordered pairs, but have been unable to
do so.

In[1]:= array = {{1,1},{2,2},{3,3},{4,4},{5,5}};
In[2]:= array[[1]][[1]]
Out[2]= 1
In[2]:= array[[1]][[1]] = 42
Out[2]= Set::setps: test in assignment of part is not a symbol.

I suppose the error arises when I attempt to set the numerical contents
of the array equal to a certain value.  Is there anyway to simply
overwrite the element at a certain address?  Why does the syntax used
above seem to work for lists?

In[3]:= list = {1,2,3,4,5};
In[4}:= list[[1]]
Out[4]= 1
In[5]:= list[[1]] = 42;
In[6]:= list
Out[6]= {42,2,3,4,5}

I have included what I have written so far at the end of this message
to put my problem in context.  As I am new to Mathematica, I do not
know hoe to write elegant, concise programs using the array of powerful
built in functions, so I appologize for my clunky code.  There is
probably a much easier way to accomplish my task.

I would appreciate any help on this matter.

Thank you,

Peter Hedman

Bellow is what I have written so far.  The comments are mostly meant
for myself, and probably do not make much sense.

g = 1;
(*sets value of liberated proton constant*)

d=0.1;
(*sets value of diffusion constant*)

v= 0.1;
(*sets value of boundry velocity*)

a = 0.1;
(*sets the value of constant \[Alpha]*)

j = 0;

(*sets the initial value of j.  This step shouldn't be necessary*)

rprevb=rprev = Table[0z, {z,0,100}];

r = 0; s = 0;

(Do[rprev[([q])] = {r, s^2}; (r++); (s++), {q, 1, 101}];)

(*These three lines create the initial list of ordered pairs*)

Do[rprevb[[q]]={0,0}, {q,1,101}]

jmax = 100;
(*initially sets the maximum horizontal range*)

iter[n_]:= If[
n==jmax , (rprev[[n+1]][[2]] + v*(g+rprev[[n+1]][[2]]) -
d*(rprev[[n+2]][[2]]-rprev[[n+1]][[2]])), (rprev[[n+1]][[2]]+
a*(rprev[[n]][[2]]-2rprev[[n+1]][[2]]+rprev[[n+2]][[2]]))] ;

(*defines transformation function*)

dim =Dimensions[rprev];

dimb = Dimensions[rprevb];

Print["Dimensions of initial list = ",dim]

Print["Dimensions of initial list = ",dimb]

initialplot = ListPlot[rprev]

Do[Do[rprevb[[(j+1)]][[2]]=iter[j]; Print[rprevb]; {j,0,jmax,1}];
rprev=rprevb; Print["time = ",t]; Print["jmax = ",jmax ];
ListPlot[rprev];
jmax--,{t,1,10}]

(*With every iteration of the outside loop,
jmax is decremented by one.  As iterations progress to flatten the
curve,
the boundry moves.  Should these two processes take place in this
way?
It appears this is not the ideal model, but it will work for
now.*)

```

• Prev by Date: Re: Modeling and Array Problem
• Next by Date: Re: D[...] change in 5.1
• Previous by thread: Re: Modeling and Array Problem
• Next by thread: Modeling and Array Problem