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 djmp at earthlink.net http://home.earthlink.net/~djmp/ 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.*)