Example 3.7b
| > |
with(linalg):with(plots): |
 |
(1) |
 |
(2) |
| > |
eq:=diff(y(x),x$2)-Pe*diff(y(x),x); |
 |
(3) |
 |
(4) |
 |
(5) |
The central difference expression for the second and first derivatives are
| > |
d2ydx2:=(y[m+1]-2*y[m]+y[m-1])/h^2; |
![`/`(`*`(`+`(y[`+`(m, 1)], `-`(`*`(2, `*`(y[m]))), y[`+`(m, `-`(1))])), `*`(`^`(h, 2)))](images/Example3.7b Rev 1_6.gif) |
(6) |
![`/`(`*`(`+`(y[m], `-`(y[`+`(m, `-`(1))]))), `*`(h))](images/Example3.7b Rev 1_7.gif) |
(7) |
The governing equation in finite difference form is:
| > |
Eq[m]:=subs(diff(y(x),x$2)=d2ydx2,diff(y(x),x)=dydx,y(x)=y[m],x=m*h,eq); |
![`+`(`/`(`*`(`+`(y[`+`(m, 1)], `-`(`*`(2, `*`(y[m]))), y[`+`(m, `-`(1))])), `*`(`^`(h, 2))), `-`(`/`(`*`(Pe, `*`(`+`(y[m], `-`(y[`+`(m, `-`(1))])))), `*`(h))))](images/Example3.7b Rev 1_8.gif) |
(8) |
A 'for loop' can be written for the interior node points as
| > |
for i to N do Eq[i]:=subs(m=i,Eq[m]);od; |
![y[0] = 1](images/Example3.7b Rev 1_13.gif) |
(10) |
![y[5] = 0](images/Example3.7b Rev 1_14.gif) |
(11) |
| > |
y[0]:=solve(Eq[0],y[0]); |
 |
(12) |
| > |
y[N+1]:=solve(Eq[N+1],y[N+1]); |
 |
(13) |
 |
(14) |
| > |
for i to N do Eq[i]:=eval(Eq[i]);od; |
| > |
eqs:=[seq(Eq[i],i=1..N)]; |
![[`+`(`*`(25, `*`(y[2])), `-`(`*`(50, `*`(y[1]))), 25, `-`(`*`(5, `*`(Pe, `*`(`+`(y[1], `-`(1))))))), `+`(`*`(25, `*`(y[3])), `-`(`*`(50, `*`(y[2]))), `*`(25, `*`(y[1])), `-`(`*`(5, `*`(Pe, `*`(`+`(y[2...](images/Example3.7b Rev 1_22.gif)
![[`+`(`*`(25, `*`(y[2])), `-`(`*`(50, `*`(y[1]))), 25, `-`(`*`(5, `*`(Pe, `*`(`+`(y[1], `-`(1))))))), `+`(`*`(25, `*`(y[3])), `-`(`*`(50, `*`(y[2]))), `*`(25, `*`(y[1])), `-`(`*`(5, `*`(Pe, `*`(`+`(y[2...](images/Example3.7b Rev 1_23.gif) |
(16) |
| > |
vars:=[seq(y[i],i=1..N)]; |
![[y[1], y[2], y[3], y[4]]](images/Example3.7b Rev 1_24.gif) |
(17) |
| > |
A:=genmatrix(eqs,vars,'B1'); |
 |
(18) |
 |
(19) |
Maple generates a row vector which can be converted to a column vector as:
| > |
B:=matrix(N,1):for i to N do B[i,1]:=B1[i]:od:evalm(B); |
 |
(20) |
The solution is obtained as:
| > |
X:=evalm(inverse(A)&*B); |
 |
(21) |
 |
(22) |
| > |
for i to N do y[i]:=X[i,1];od; |
| > |
y[0]:=eval(y[0]);y[N+1]:=eval(y[N+1]); |
 |
 |
(24) |
| > |
ya:=(exp(Pe)-exp(Pe*x))/(exp(Pe)-1); |
 |
(25) |
| > |
p1:=plot([seq([i*h,subs(Pe=1,y[i])],i=0..N+1)],thickness=4,color=blue,axes=boxed): |
| > |
p2:=plot(subs(Pe=1,ya),x=0..1,thickness=5,color=brown,axes=boxed,linestyle=2): |
| > |
display({p1,p2},title="Figure Exp. 3.1.11.",labels=[x,"y"]); |
| > |
p1:=plot([seq([i*h,subs(Pe=50,y[i])],i=0..N+1)],thickness=4,color=green,axes=boxed): |
| > |
p2:=plot(subs(Pe=50,ya),x=0..1,thickness=5,color=brown,axes=boxed,linestyle=2): |
| > |
display({p1,p2},title="Figure Exp. 3.1.12.",labels=[x,"y"]); |
We observe that when the forward difference accurate to the order h2 is used, even when the Peclet number is 1, there is a slight discrepancy between the finite difference solution and the analytical solution. However, when the Peclet number is high (Pe = 50) the forward difference scheme does not five an unrealistic oscillation like the central difference scheme. Note that for three digit accuracy with the analytical solution, N = 40 and 110 interior note points are required for central difference and forward difference approximations, respectively.