Example 6.3 Rev 1 b.mw

Example 6.3

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

The governing equation is entered in the following form:

> | ge:=diff(u(x,y),y$2)=2*Pe*(1-x^2)*diff(u(x,y),y)-diff(u(x,y),x$2)-1/x*diff(u(x,y),x);

| (1)

> | Digits:=30;

| (2)

For this exmaple, Digits has to be set to 30 for accurate predicitons. The boundary conditions are enterered as:

> | bc1:=diff(u(x,y),x);

| (3)

> | bc2:=u(x,y)-1;

| (4)

> | bc3:=u(x,y)-0;

| (5)

> | bc4:=diff(u(x,y),y);

| (6)

Parameters are entered here:

> | Pe:=1.0;

| (7)

> | epsilon:=1;

| (8)

> | L:=1;

| (9)

> | H:=2;

| (10)

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

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

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

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

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

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

> | N:=2;

| (11)

> | eq[0]:=bc1;

| (12)

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

| (13)

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

| (14)

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

| (15)

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

| (16)

> | for i from 1 to N do eq[i]:=diff(u[i](zeta),zeta)= -u[N+1+i](zeta);od;

| (17)

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

| (18)

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

| (19)

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

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

| (20)

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

> | Nrow:=rowdim(A);

| (21)

> | II:=eigenvalues(A):

> | for i to Nrow do lambda[i]:=II[i]; end do:

> | 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]: end do: cons:=fsolve({seq(eqx[i],i=1..Nrow)},{seq(beta[i],i=1..Nrow)}): assign(cons): XX[k]:=map(eval,evalm(X)): for i to Nrow do unassign('beta[i]'): end do: end do:

> | PV:=Matrix(Nrow,Nrow,[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]*zeta): end do:

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

> |

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

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

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

| (22)

> |

> | mat1:=evalm(subs(zeta=zeta-zeta1,evalm(mat))):

> | b2:=evalm(subs(zeta=zeta1,evalm(b))):

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

> | mat2:=map(expand,mat2):

> | mat3:=map(int,mat2,zeta1=0..zeta):

> | Y0:=matrix(2*N,1);

| (23)

> | for i to N do Y0[i,1]:=p[i];od:

> | for i to N do Y0[N+i,1]:=c[i]:od:

> | evalm(Y0);

| (24)

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

> | sol0:=map(eval,evalm(subs(zeta=0,evalm(Y)))):

> | sol1:=map(eval,evalm(subs(zeta=epsilon*H/h,evalm(Y)))):

> | for i to N do Eq[i]:=subs(diff(u(x,y),y)=epsilon/h*c[i],u(x,y)=p[i],x=i*h,bc3);od;

| (25)

> | for i to N do Eq[N+i]:=evalf(subs(diff(u(x,y),y)=epsilon/h*sol1[N+i,1],u(x,y)=sol1[i,1],bc4));od:

> | csol:=solve({seq(Eq[i],i=1..2*N)},{seq(c[i],i=1..N),seq(p[i],i=1..N)});

| (26)

> | assign(csol);

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

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

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

> | for i from 0 to N+1 do u[i](y):=eval(subs(zeta=epsilon*y/h,u[i](zeta)));od:

> | for i from 0 to N+1 by 2 do p[i]:=plot(u[i](y),y=0..H,thickness=3);od:

> | pp:=plot([seq(u[i](y),i=0..N+1,2)],y=0..H,thickness=3,legend=[seq(typeset(u[i],"(y)"),i=0..N+1,2)]);

| (27)

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

> | M:=5;

| (28)

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

> | P[1]:=plot([seq([h*i,0.],i=0..N+1)],style=line,thickness=3,axes=boxed):

> | for j from 2 to M+1 do P[j]:=plot([seq([h*i,evalf(subs(y=T1[j],evalf(u[i](y))))],i=0..N+1)],style=line,thickness=3,title="Figure Exp. 6.8.",axes=boxed):od:

> | for j from 1 to M+1 do pt[j]:=textplot([0.5,evalf(subs(y=T1[j],u[5](y))),typeset(y,sprintf("=%4.2f",T1[j]))],align={above,left}); od:

> | display({seq(P[i],i=1..M+1),seq(pt[i],i=1..M+1)},labels=[x,u]);

Error:TEXT location must be numeric; received: [.5, u[5](1.60000000000000000000000000000)] |

> | a:=convert(T1[2],string);

| (29)

> | a1:=sprintf("%4.2f",T1[2]);

| (30)

> | Ny:=30;

| (31)

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

| (32)

> | for i from 1 to N+2 do for j from 1 to Ny do PP[i,j]:=evalf(subs(y=(j-1)*H/(Ny-1),u[i-1](y)));od;od:

> | PP[N+2,1]:=0;

| (33)

> | plotdata := [seq([ seq([(i-1)/(N+1),(j-1)*H/(Ny-1),PP[i,j]], i=1..N+2)], j=1..Ny)]:

> | surfdata(plotdata,axes=boxed,title="Figure Exp. 6.9.", labels=[x,y,u],orientation=[-150,45] );

> |