Example 5.9

> | restart;

> | with(linalg):with(plots):

> | UseHardwareFloats := true;

| (1)

> | ge:=diff(u(x,t),t)=diff(u(x,t),x$2);

| (2)

> | bc1:=u(x,t);

| (3)

> | bc2:=u(x,t);

| (4)

> | IC:=u(x,0)=1;

| (5)

> | N:=40;

| (6)

> | L:=1;

| (7)

> | dydxf:=1/2*(-u[2](t)-3*u[0](t)+4*u[1](t))/h:

> | dydxb:=1/2*(u[N-1](t)+3*u[N+1](t)-4*u[N](t))/h:

> | dydx:=1/2/h*(u[m+1](t)-u[m-1](t)):

> | d2ydx2:=1/h^2*(u[m-1](t)-2*u[m](t)+u[m+1](t)):

> | bc1:=subs(diff(u(x,t),x)=dydxf,u(x,t)=u[0](t),x=0,bc1):

> | bc2:=subs(diff(u(x,t),x)=dydxb,u(x,t)=u[N+1](t),x=1,bc2):

> | eq[0]:=bc1:

> | eq[N+1]:=bc2:

> | for i from 1 to N do eq[i]:=diff(u[i](t),t)= subs(diff(u(x,t),x$2) = subs(m=i,d2ydx2),diff(u(x,t),x) = subs(m=i,dydx),u(x,t)=u[i](t),x=i*h,rhs(ge));od:

> | u[0](t):=(solve(eq[0],u[0](t)));

| (8)

> | u[N+1](t):=solve(eq[N+1],u[N+1](t));

| (9)

> | for i from 1 to N do eq[i]:=eval(eq[i]);od:

> | eqs:=[seq(rhs(eq[j]),j=1..N)]:

> | Y:=[seq(u[i](t),i=1..N)]:

> | A:=genmatrix(eqs,Y,'b1'):

> | b:=matrix(N,1):for i to N do b[i,1]:=-eval(b1[i]);od:evalm(b):

> | h:=eval(L/(N+1)):

> | A:=map(eval,A):

> | if N > 4 then A:=map(evalf,A);end:

> | #evalm(A);

> | Nrow:=rowdim(A):

> | l:=evalf(eigenvalues(A)):

> | for i to Nrow do lambda[i]:=l[i];od:

> | Id:=Matrix(Nrow,Nrow,shape=identity):

> | X:=matrix(Nrow,1,[seq(beta[i],i=1..Nrow)]):

> | for k to Nrow do:

> | G:=evalm((A-lambda[k]*Id)&*X):

> | eqx[1]:=beta[1]=1:for i from 2 to Nrow do eqx[i]:=G[i-1,1]:od:

> | for i to Nrow do beta[i]:=fsolve(eqx[i],beta[i]);od:

> | XX[k]:=map(eval,evalm(X)):

> | for i to Nrow do unassign('beta[i]'):od:od:

> | P:=Matrix([seq(evalm(XX[i]),i=1..Nrow)]):

> | expD1:=Matrix(1..Nrow,1..Nrow,shape=diagonal):

> | for i to Nrow do expD1[i,i]:=exp(lambda[i]*t):od:

> | mat:=evalm(P&*expD1&*inverse(P)):

> | Y0:=matrix(N,1):for i from 1 to N do Y0[i,1]:=evalf(subs(x=i*h,rhs(IC)));od:evalm(Y0):

> | b2:=subs(t=tau,evalm(b)):

> | mat2:=subs(t=t-tau,evalm(mat)):

> | mat3:=evalm(mat2&*b2):

> | mat4:=map(int,mat3,tau=0..t):

> | Y:=evalm(mat&*Y0+mat4):

> | for i from 1 to N do u[i](t):=evalf((Y[i,1]));od:

> | for i from 0 to N+1 do u[i](t):=eval(u[i](t));od:

> | setcolors(["Red", "Blue", "LimeGreen", "Goldenrod", "maroon", "DarkTurquoise", "coral", "aquamarine", "magenta", "khaki", "sienna", "orange", "yellow", "gray"]):

> | pp:=plot([seq(subs(delta=1,u[i](t)),i=0..N+1,5)],t=0..0.4,thickness=3);

| (10)

> | pt:=textplot([seq([0.05+i*0.002,evalf(subs(delta=1,t=0.05+i*0.002,u[i](t))),typeset(u[i]),align=right],i=0..N+1,5)]);

| (11)

> | display([pp,pt],title="Figure Exp.5.30.",axes=boxed,labels=[t,"u"]);

> | for i from 0 to N+1 do p[i]:=plot(subs(delta=0.1,u[i](t)),t=0..0.4,thickness=3);od:

> | tf:=0.1;

| (12)

> | M:=30;

| (13)

> | T1:=[seq(tf*i/M,i=0..M)];

| (14)

> | PP:=matrix(N+2,M+1);

| (15)

> | for i from 1 to N+2 do PP[i,1]:=evalf(subs(x=(i-1)*h,rhs(IC)));od:

> | for i from 1 to N+2 do for j from 2 to M+1 do PP[i,j]:=evalf(subs(t=T1[j],subs(delta=1,u[i-1](t))));od;od:

> | plotdata:= [seq([ seq([(i-1)*h,T1[j],PP[i,j]], i=1..N+2)], j=1..M+1)]:

> | surfdata(plotdata,axes=boxed,title="Figure Exp. 5.31.",labels=[x,t,u],orientation=[45,45]);

> |