wave eq. problem - Mathematica on the Mac quits!

*To*: mathgroup at yoda.physics.unc.edu*Subject*: wave eq. problem - Mathematica on the Mac quits!*From*: gaylord at ux1.cso.uiuc.edu*Date*: Tue, 21 Apr 1992 04:38:07 -0500

=================================== =================================== Chris Haase writes:" "Here is a short code that computes a numerical sulution to the wave equation. It is a modified version of a solution to the diffusion equation that was sent to me. Anyway, without the For-loop, Mathematica responds with a $RecursionLimit exceeded error. Is there a slick way to define the recursion function that will prevent such an error? (* Waves by finite difference equation *) Clear[i, n, u]; step=30; (* The finite difference form of the wave equation: the variable i represents the mesh position the variable n represents the time step *) u[i_, n_] := u[i, n] = u[i+1, n-1] + u[i-1,n-1] - u[i,n-2]; (* The boundary conditions and initializing profile *) For[i=-10,i<=step+10,i++,Module[{j}, For[j=-10, j<=0, j++, u[i,j]=0;] For[j=step,j<=step+10,j++, u[i,j]=0;] ] ] u[14,-1] = 1.; u[14,0] = 1.; u[15,-1] = 2.; u[15,0] = 2.; u[16,-1] = 1.; u[16,0] = 1.; (* Plot the initial and displaced profiles *) plot1 = ListPlot[Table[u[i,0], {i, 1, step}], PlotRange -> {{0,Step}, {-1,1}}, PlotJoined -> True, AxesLabel -> {"x-position","amplitude"}, DisplayFunction -> Identity]; plot2 = ListPlot[Table[u[i, 4], {i, 1, step}], PlotJoined -> True, AxesLabel -> {"x-position","amplitude"}, DisplayFunction -> Identity]; Show[plot1,plot2, PlotRange -> {{1, step}, {0,2}}, DisplayFunction -> $DisplayFunction]; ============================ ============================ eliminating the third For statement does not affect the program at all; it seems to be unnecessary. eliminating the second For statement produces the recursion depth exceeded... message. i then used the obvious bypass (p. 309 in the bible) $RecursionLimit = X; to get past the recusion limit and the following happened (using the program given below) for X = 2000 and 3000, the recursion depth message still occurred. for X = 5000, I got a "application ' unknown' quit because of a type 28 error" message and Mathematica quit (the program causing this is given below). additional information: i ran this on a IIfx Mac with 20 Mbytes of RAM and Mathematica 2.0.0 partitioned for 15 Mb under system 7.1.1.1. ===================================== ===================================== (* Waves by finite difference equation *) Clear[i, n, u]; $RecursionLimit = 5000; step=30; (* The finite difference form of the wave equation: the variable i represents the mesh position the variable n represents the time step *) u[i_, n_] := u[i, n] = u[i+1, n-1] + u[i-1,n-1] - u[i,n-2]; (* The boundary conditions and initializing profile *) For[i=-10,i<=step+10,i++,Module[{j}, ] ] u[14,-1] = 1.; u[14,0] = 1.; u[15,-1] = 2.; u[15,0] = 2.; u[16,-1] = 1.; u[16,0] = 1.; (* Plot the initial and displaced profiles *) plot1 = ListPlot[Table[u[i,0], {i, 1, step}], PlotRange -> {{0,Step}, {-1,1}}, PlotJoined -> True, AxesLabel -> {"x-position","amplitude"}, DisplayFunction -> Identity]; plot2 = ListPlot[Table[u[i, 4], {i, 1, step}], PlotJoined -> True, AxesLabel -> {"x-position","amplitude"}, DisplayFunction -> Identity]; Show[plot1,plot2, PlotRange -> {{1, step}, {0,2}}, DisplayFunction -> $DisplayFunction];