Example5.2.5 Rev 1.mw

Example 5.2.5 Two Coupled PDEs

> | restart;

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

Enter the governing equations:

> | ge[1]:=diff(u[1](x,t),t)=diff((u[2](x,t)-1)*diff(u[1](x,t),x),x)+(16*x*t-2*t-16*(u[2](x,t)-1))*(u[1](x,t)-1)+10*x*exp(-4*x);

| (1)

> | ge[2]:=diff(u[2](x,t),t)=diff(u[2](x,t),x$2)+diff(u[1](x,t),x)+4*(u[1](x,t)-1)+x^2-2*t-10*t*exp(-4*x);

| (2)

Enter the boundary conditions at x = 0:

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

| (3)

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

| (4)

Enter the boundary conditions at x = 1:

> | bc2[1]:=3*u[1](x,t)+diff(u[1](x,t),x)-3;

| (5)

> | bc2[2]:=5*diff(u[2](x,t),x)-evalf(exp(4))*(u[1](x,t)-1);

| (6)

Enter the initial conditions:

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

| (7)

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

| (8)

Enter the number of governing equations:

> | NN:=2;

| (9)

> | N:=2;

| (10)

> | L:=1;

| (11)

Develop finite difference expressions for the first and second derivatives for the given two dependent dependent variables:

> | for i to NN do

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

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

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

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

| (12)

Convert the boundary conditions to the finite difference form:

> | for i to NN do bc1[i]:=subs(diff(u[1](x,t),x)=dydxf[1],diff(u[2](x,t),x)=dydxf[2],u[1](x,t)=u[0,1](t),u[2](x,t)=u[0,2](t),x=0,bc1[i]);od;

| (13)

> | for i to NN do bc2[i]:=subs(diff(u[1](x,t),x)=dydxb[1],diff(u[2](x,t),x)=dydxb[2],u[1](x,t)=u[N+1,1](t),u[2](x,t)=u[N+1,2](t),x=L,bc2[i]);od;

| (14)

> | for i to NN do eq[0,i]:=bc1[i];eq[N+1,i]:=bc2[i];od;

| (15)

Convert the first governing equation to the finite difference form:

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

| (16)

Convert the second governing equation to the finite difference form:

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

| (17)

> | for i to NN do u[0,i](t):=(solve(eq[0,i],u[0,i](t)));od;

| (18)

Eliminate the boundary values:

> | for i to NN do u[N+1,i](t):=(solve(eq[N+1,i],u[N+1,i](t)));od;

| (19)

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

| (20)

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

| (21)

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

| (22)

Store the governing equations in eqs:

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

| (23)

Store the dependent variables in Y:

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

| (24)

Store the initial conditions in ICs:

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

| (25)

> | sol:=dsolve({eqs,ICs},{Y},type=numeric,stiff=true,maxfun=1000000,abserr=1e-6,relerr=1e-5,output=listprocedure);

| (26)

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

> | for i to NN do U[0,i]:=subs(u[1,1](t)=U[1,1],u[1,2](t)=U[1,2],u[2,1](t)=U[2,1],u[2,2](t)=U[2,2],u[0,i](t));od;

| (27)

> | for i to NN do U[N+1,i]:=eval(subs(u[N,1](t)=U[N,1],u[N,2](t)=U[N,2],u[N-1,1](t)=U[N-1,1],u[N-1,2](t)=U[N-1,2],u[N+1,i](t)));od;

| (28)

The numerical solution obtained is compared with the exact analytical solution at x = 1:

> | ua:=1+10*x*t*exp(-4*x);

| (29)

> | va:=1+x^2*t;

| (30)

> | U[N+1,1](1);evalf(subs(x=1.,t=1.,ua));

| (31)

> | evalf(U[N+1,2](1));evalf(subs(x=1.,t=1.,va));

| (32)

> | U[N+1,1](2);evalf(subs(x=1.,t=2.,ua));

| (33)

> | evalf(U[N+1,2](2));evalf(subs(x=1.,t=2.,va));

| (34)

We obtain reasonable results even with N=2 node points.

> | tf:=1.;

| (35)

> | M:=30;

| (36)

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

| (37)

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

| (38)

> | for i from 1 to N+2 do PP[i,1]:=evalf(subs(x=(i-1)*h,rhs(IC[1])));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,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.11.",labels=[x,t,"u"],orientation=[-45,60]);

> | plot3d(ua,x=0..1,t=0..1,axes=boxed,title="Figure Exp. 5.2.12.",labels=[x,t,"ua"],orientation=[-45,60]);

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

| (39)

> | for i from 1 to N+2 do PP[i,1]:=evalf(subs(x=(i-1)*h,rhs(IC[2])));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,2](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.13.",labels=[x,t,"v"],orientation=[-45,60]);

> | plot3d(va,x=0..1,t=0..1,labels=[x,t,"va"],axes=boxed,title="Figure Exp. 5.2.14.",orientation=[-45,60]);

> |

The results obtained with N = 10 are: