Example5.2.5 Rev 1.mw
Example 5.2.5 Two Coupled PDEs
| > |
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); |
, t) = `+`(`*`(diff(u[2](x, t), x), `*`(diff(u[1](x, t), x))), `*`(`+`(u[2](x, t), `-`(1)), `*`(diff(diff(u[1](x, t), x), x))), `*`(`+`(`*`(16, `*`(x, `*`(t))), `-`(`*`(2, `*`(t))), `-`...](images/Example5.2.5 Rev 1_1.gif)
, t) = `+`(`*`(diff(u[2](x, t), x), `*`(diff(u[1](x, t), x))), `*`(`+`(u[2](x, t), `-`(1)), `*`(diff(diff(u[1](x, t), x), x))), `*`(`+`(`*`(16, `*`(x, `*`(t))), `-`(`*`(2, `*`(t))), `-`...](images/Example5.2.5 Rev 1_2.gif) |
(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); |
, t) = `+`(diff(diff(u[2](x, t), x), x), diff(u[1](x, t), x), `*`(4, `*`(u[1](x, t))), `-`(4), `*`(`^`(x, 2)), `-`(`*`(2, `*`(t))), `-`(`*`(10, `*`(t, `*`(exp(`+`(`-`(`*`(4, `*`(x))))))...](images/Example5.2.5 Rev 1_3.gif) |
(2) |
Enter the boundary conditions at x = 0:
, `-`(1))](images/Example5.2.5 Rev 1_4.gif) |
(3) |
, `-`(1))](images/Example5.2.5 Rev 1_5.gif) |
(4) |
Enter the boundary conditions at x = 1:
| > |
bc2[1]:=3*u[1](x,t)+diff(u[1](x,t),x)-3; |
)), diff(u[1](x, t), x), `-`(3))](images/Example5.2.5 Rev 1_6.gif) |
(5) |
| > |
bc2[2]:=5*diff(u[2](x,t),x)-evalf(exp(4))*(u[1](x,t)-1); |
, x))), `-`(`*`(54.59815003, `*`(u[1](x, t)))), 54.59815003)](images/Example5.2.5 Rev 1_7.gif) |
(6) |
Enter the initial conditions:
 = 1](images/Example5.2.5 Rev 1_8.gif) |
(7) |
 = 1](images/Example5.2.5 Rev 1_9.gif) |
(8) |
Enter the number of governing equations:
 |
(9) |
 |
(10) |
 |
(11) |
Develop finite difference expressions for the first and second derivatives for the given two dependent dependent variables:
| > |
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; |
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; |
, `-`(1))](images/Example5.2.5 Rev 1_21.gif) |
, `-`(1))](images/Example5.2.5 Rev 1_22.gif) |
(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; |
)), `/`(`*`(`/`(1, 2), `*`(`+`(u[1, 1](t), `*`(3, `*`(u[3, 1](t))), `-`(`*`(4, `*`(u[2, 1](t))))))), `*`(h)), `-`(3))](images/Example5.2.5 Rev 1_23.gif) |
, `*`(3, `*`(u[3, 2](t))), `-`(`*`(4, `*`(u[2, 2](t))))))), `*`(h)), `-`(`*`(54.59815003, `*`(u[3, 1](t)))), 54.59815003)](images/Example5.2.5 Rev 1_24.gif) |
(14) |
| > |
for i to NN do eq[0,i]:=bc1[i];eq[N+1,i]:=bc2[i];od; |
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; |
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; |
| > |
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; |
 |
(20) |
| > |
for i from 1 to N do eq[i,1]:=eval(eq[i,1]);od; |
| > |
for i from 1 to N do eq[i,2]:=eval(eq[i,2]);od; |
Store the governing equations in eqs:
| > |
eqs:=seq(seq((eq[i,j]),i=1..N),j=1..NN); |
Store the dependent variables in Y:
| > |
Y:=seq(seq(u[i,j](t),i=1..N),j=1..NN); |
, u[2, 1](t), u[1, 2](t), u[2, 2](t)](images/Example5.2.5 Rev 1_61.gif) |
(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); |
 = 1, u[2, 1](0) = 1, u[1, 2](0) = 1, u[2, 2](0) = 1](images/Example5.2.5 Rev 1_62.gif) |
(25) |
| > |
sol:=dsolve({eqs,ICs},{Y},type=numeric,stiff=true,maxfun=1000000,abserr=1e-6,relerr=1e-5,output=listprocedure); |
| > |
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; |
![`+`(`-`(`*`(`/`(1, 5), `*`(U[1, 1]))), `*`(`/`(4, 5), `*`(U[2, 1])), `/`(2, 5))](images/Example5.2.5 Rev 1_68.gif) |
![`+`(`-`(`*`(.3333333332, `*`(U[1, 2]))), `*`(1.333333333, `*`(U[2, 2])), `-`(`*`(.4853168888, `*`(U[1, 1]))), `*`(1.941267556, `*`(U[2, 1])), `-`(1.455950666))](images/Example5.2.5 Rev 1_69.gif) |
(28) |
The numerical solution obtained is compared with the exact analytical solution at x = 1:
| > |
ua:=1+10*x*t*exp(-4*x); |
 |
(29) |
 |
(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.
 |
(35) |
 |
(36) |
| > |
T1:=[seq(tf*i/M,i=0..M)]; |
![array( 1 .. 4, 1 .. 31, [ ] )](images/Example5.2.5 Rev 1_87.gif) |
(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]); |
![array( 1 .. 4, 1 .. 31, [ ] )](images/Example5.2.5 Rev 1_90.gif) |
(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: