Re: PDE with RecurrenceTable
- To: mathgroup at smc.vnet.net
- Subject: [mg124766] Re: PDE with RecurrenceTable
- From: Peter Pein <petsie at dordos.net>
- Date: Sat, 4 Feb 2012 06:33:42 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jgg1es$bph$1@smc.vnet.net>
Am 03.02.2012 08:13, schrieb Alexei Boulbitch: > Dear Community, > > > > I am trying to make a simple numeric FEM solution of parabolic PDE. It seems that RecurrenceTable function is designed exactly for such a job. Indeed, in the Help/RecurrenceTable/Scope/Partial Difference Equations one finds an example. My problem is that this example is only one, and I would say, it is not basic enough. > > > > My question: do you know some other examples of the use of the RecurrenceTable for this sort of equations?? > > > > I would like to explain: I already went through the MathGroup archive and have seen numerous posts recommending various sophisticated FEM packages. My question is not about them. I want to learn to make simple programs of this sort myself to fast test an equation at hand. > > > > For example, here is a classical equation of temperature conductivity: > > > > (\[PartialD]u(x,t))/\[PartialD]t=a^2*(\[PartialD]^2u(x,t))/\[PartialD]x^2 > > > > with a=0.1, the boundary conditions: u[0,t]==1 and u[1,t]==0 and the initial condition u[x,0]== Cos[3 \[Pi]*x/2]; > > using the explicit method on the rectangular lattice, taken from a textbook: > > > > u[j,k+1]=\[Sigma]*u[j+1,k]+(1-2*\[Sigma])*u[j,k]+\[Sigma]*u[j-1,k]; > > \[Sigma]=(a^2*\[Tau])/h^2; > > > > Tau and h are temporal and spatial step sizes. > > > > This is the code: > > > > a = 0.1; > > h = 0.1; > > \[Tau] = 0.0001; > > \[Sigma] = a^2*\[Tau]/h^2; > > lst2 = RecurrenceTable[{u[j, > > k + 1] == \[Sigma]*u[j + 1, k] + (1 - 2*\[Sigma])* > > u[j, k] + \[Sigma]*u[j - 1, k], u[j, 0] == Cos[3 Pi*j/20.], > > u[0, k] == 1, u[10, k] == 0}, u, {j, 0, 10}, {k, 0, 100}]; > > > > > > Show[{ > > ListPlot3D[lst2, > > AxesLabel -> {Style["t", 16, Italic], Style["x", 16, Italic], > > Style["u", 16, Italic]}, PlotStyle -> Blue], > > Plot3D[0, {t, 0, 100}, {x, 0, 10}, > > PlotStyle -> {Yellow, Opacity[0.4]}] > > }] > > > > The solution obtained this way, however, does not show evolution. It is clear that with increasing t the temperature, u, should forget its initial form and approach to a straight line. What is wrong? > > > > Thank you, Alexei > > > > > > Alexei BOULBITCH, Dr., habil. > > IEE S.A. > > ZAE Weiergewan, > > 11, rue Edmond Reuter, > > L-5326 Contern, LUXEMBOURG > > > > Office phone : +352-2454-2566 > > Office fax: +352-2454-3566 > > mobile phone: +49 151 52 40 66 44 > > > > e-mail: alexei.boulbitch at iee.lu<mailto:alexei.boulbitch at iee.lu> Hi Alexei, it seems to me that your tau (delta-t) and/or maximum k is far too small to observe the flattening. I'll use ListConvolve, because it is much faster; the algorithm is still the same: a=1/10; h=1/10; \[Tau]=1/10000; \[Sigma]=a^2*\[Tau]/h^2; kmax=121000; (* just to get the zero of u[3/4,t] *) To avoid memory problems when plotting the result, I'll take ~ 100 data lines: lst2 = NestList[ Flatten[{1, ListConvolve[{\[Sigma], 1 - 2*\[Sigma], \[Sigma]}, #1], 0}] & , Table[Cos[(3.*Pi*j)/20], {j, 0, 10}], kmax][[1 ;; All ;; Floor[kmax/100]]]; Now the flattening is visible "to the naked eye": Show[ListPlot3D[lst2, AxesLabel -> {Style["x", 16, Italic], Style["t", 16, Italic], Style["u", 16, Italic]}, PlotStyle -> {Lighter[Blue], Specularity[White, 22]}, DataRange -> {{0, 1}, {0, kmax*\[Tau]}}, PlotRange -> All], Plot3D[0, {x, 0, 1}, {t, 0, kmax*\[Tau]}, PlotStyle -> {Yellow, Opacity[0.4]}]] Peter