Example 5.2.1 Rev 1.mw

Example 5.2.1 Diffusion with Second Order Reaction

> | restart;

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

Enter the governing equation:

> | ge:=diff(u(x,t),t)=diff(u(x,t),x$2)-Phi^2*u(x,t)^2;

| (1)

Enter the boundary conditions:

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

| (2)

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

| (3)

Enter the initial condition:

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

| (4)

> | N:=10;

| (5)

> | L:=1;

| (6)

Enter the value of parameters:

> | Phi:=1;

| (7)

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

| (8)

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

| (9)

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

| (10)

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

| (11)

Convert the boundary conditions to the finite difference form:

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

| (12)

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

| (13)

> | eq[0]:=bc1;

| (14)

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

| (15)

Convert the governing equation to the finite difference form:

> | 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;

| (16)

The boundary values are eliminated using the boundary conditions:

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

| (17)

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

| (18)

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

| (19)

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

| (20)

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

| (21)

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

| (22)

> | ICs:=seq(u[i](0)=rhs(IC),i=1..N);

| (23)

Solve the equations numerically and store the numerical solutions in U[i].

> | sol:=dsolve({eqs,ICs},{Y},type=numeric,output=listprocedure);

| (24)

> | for i to N do U[i]:=subs(sol,u[i](t));od:

> | U[0]:=subs(u[1](t)=U[1],u[2](t)=U[2],u[0](t));

| (25)

> | U[N+1]:=subs(u[N](t)=U[N],u[N-1](t)=U[N-1],u[N+1](t));

| (26)

Plot the numerical solutions:

> | for i from 0 to N+1 do p[i]:=plot(U[i](t),t=0..0.4,thickness=3,color=COLOR(HUE,i/(N+2)));od:

> | arw:=arrow(<0.1,1.01>,<0.1,-0.82>,width=[1/600,relative],head_width=[5,relative],head_length=[1/20,relative]): pt:=textplot([[0.3,0.257,"Follow the arrow:"],seq([0.26,0.21-i*0.05,typeset(u[i],"(t)")],i=0..2),[0.26,0.08,"..."],[0.264,0.03,typeset(u[N+1],"(t)")]]):

> | display([seq(p[i],i=0..N+1),arw,pt],title="Figure 5.2.1.",axes=boxed,labels=[t,"u"]);

> | tf:=0.4;

| (27)

> | M:=30;

| (28)

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

| (29)

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

| (30)

> | 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],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.2.2.",labels=[x,t,u],orientation=[-45,60]);

> |