Example 6.1
| > |
| (1) |
| > | ge:=diff(u(x,y),y$2)=-epsilon^2*diff(u(x,y),x$2); |
| (2) |
| > | bc1:=u(x,y)-0; |
| (3) |
| > | bc2:=u(x,y)-0; |
| (4) |
| > | bc3:=u(x,y)-0; |
| (5) |
| > | bc4:=u(x,y)-1; |
| (6) |
| > | epsilon:=1; |
| (7) |
| > | dydxf:=1/2/h*(-u[m+2](zeta)-3*u[m](zeta)+4*u[m+1](zeta)); |
| (8) |
| > | dydxb:=1/2/h*(u[m-2](zeta)+3*u[m](zeta)-4*u[m-1](zeta)); |
| (9) |
| > | dydx:=1/2/h*(u[m+1](zeta)-u[m-1](zeta)); |
| (10) |
| > | d2ydx2:=1/h^2*(u[m-1](zeta)-2*u[m](zeta)+u[m+1](zeta)); |
| (11) |
| > | bc1:=subs(diff(u(x,y),x)=subs(m=0,dydxf),u(x,y)=u[0](zeta),x=0,bc1); |
| (12) |
| > | bc2:=subs(diff(u(x,y),x)=subs(m=N+1,dydxb),u(x,y)=u[N+1](zeta),x=1,bc2); |
| (13) |
| > | N:=10; |
| (14) |
| > | eq[0]:=bc1; |
| (15) |
| > | eq[N+1]:=bc2; |
| (16) |
| > | 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),u(x,y)=u[i](zeta),x=i*h,rhs(h^2/epsilon^2*ge));od; |
| (17) |
| > | u[0](zeta):=(solve(eq[0],u[0](zeta))); |
| (18) |
| > | u[N+1](zeta):=solve(eq[N+1],u[N+1](zeta)); |
| (19) |
| > | for i from 1 to N do eq[i]:=diff(u[i](zeta),zeta)=u[N+1+i](zeta);od; |
| (20) |
| > | 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; |
| (21) |
| > | eqns:=[seq(rhs(eq[j]),j=1..N),seq(rhs(eq[N+1+j]),j=1..N)]; |
| (22) |
| > | Y:=[seq(u[i](zeta),i=1..N),seq(u[N+1+i](zeta),i=1..N)]; |
| (23) |
| > | A:=genmatrix(eqns,Y,'b1'); |
![]() |
(24) |
| > | if N>2 then A:=map(evalf,A):end; |
![]() |
(25) |
| > | evalm(A); |
![]() |
(26) |
| > | b:=matrix(2*N,1):for i from 1 to 2*N do b[i,1]:=-b1[i];od:evalm(b); |
| (27) |
| > | h:=eval(1/(N+1)); |
| (28) |
| > | J:=jordan(A,S); |
| (29) |
| > | mat:=evalm(S&*exponential(J,zeta)&*inverse(S)): |
| > | 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); |
| (30) |
| > | 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); |
| (31) |
| > | Y:=evalm(mat&*Y0+mat3): |
| > | sol0:=map(eval,evalm(subs(zeta=0,evalm(Y)))): |
| > | sol1:=map(eval,evalm(subs(zeta=epsilon/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; |
| (32) |
| > | 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; |
| (33) |
| > | csol:=solve({seq(Eq[i],i=1..2*N)},{seq(c[i],i=1..N),seq(p[i],i=1..N)}); |
| (34) |
| > | 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; |
| (35) |
| > | for i from 0 to N+1 do
pl[i]:=line([0.3,0.98-abs(i-5.25)*0.14],[0.6,evalf(subs(y=0.6,u[i](y)))],thickness=1,linestyle=dot); pt[i]:=textplot([0.3,0.98-abs(i-5.25)*0.14,typeset(u[i],"(y)")],align=left): end do: |
| > | pp:=plot([seq(u[i](y),i=0..N+1)],y=0..1); |
| (36) |
| > | display([pp,seq(pl[i],i=0..N+1),seq(pt[i],i=0..N+1)],axes=boxed,thickness=3,title="Figure Exp. 6.1.",labels=[y,"u"]); |
![]() |
| > | M:=10; |
| (37) |
| > | T1:=[seq(evalf(i/M),i=0..M)]; |
| (38) |
| > | for j from 1 to M do P[j]:=plot([seq([h*i,evalf(subs(y=T1[j],evalf(u[i](y))))],i=0..N+1)],style=line,thickness=3,axes=boxed,view=[0..1,0..1.1]):od: |
| > | P[M+1]:=plot([seq([h*i,evalf(subs(x=i*h,1))],i=0..N+1)],style=line,thickness=3,title="Figure Exp. 6.2.",axes=boxed): |
| > | 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); od: |
| > | display({seq(P[i],i=1..M+1),seq(pt[j],j=1..M+1)},labels=[x,u]); |
![]() |
| > | Ny:=30; |
| (39) |
| > | PP:=matrix(N+2,Ny); |
| (40) |
| > | for i to Ny do PP[1,i]:=0;PP[N+2,i]:=0;od: |
| > | for i to N+2 do PP[i,1]:=0;PP[i,Ny]:=1;od: |
| > | for i from 2 to N+1 do for j from 2 to Ny-1 do PP[i,j]:=evalf(subs(y=(j-1)/(Ny-1),u[i-1](y)));od;od: |
| > | plotdata := [seq([ seq([(i-1)/(N+1),(j-1)/(Ny-1),PP[i,j]], i=1..N+2)], j=1..Ny)]: |
| > | surfdata(plotdata,axes=boxed,title="Figure Exp. 6.3.",labels=[x,y,u],orientation=[-120,60] ); |
![]() |
| > |