Download Example 6.1 Rev 1N2

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

Basis (linear algebra) wikipedia , lookup

System of polynomial equations wikipedia , lookup

Cartesian tensor wikipedia , lookup

Jordan normal form wikipedia , lookup

History of algebra wikipedia , lookup

Linear algebra wikipedia , lookup

Cayley–Hamilton theorem wikipedia , lookup

Eigenvalues and eigenvectors wikipedia , lookup

Equation wikipedia , lookup

Matrix calculus wikipedia , lookup

System of linear equations wikipedia , lookup

Transcript
Example 6.1 N2
>
Enter the governing equation:
> ge:=diff(u(x,y),y$2)=-epsilon^2*diff(u(x,y),x$2);
Enter the boundary conditions:
> bc1:=u(x,y)-0;
> bc2:=u(x,y)-0;
> bc3:=u(x,y)-0;
> bc4:=u(x,y)-1;
> epsilon:=1;
Enter the finite difference approximations for the derivatives:
> 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));
Convert the boundary conditions to finite difference form:
>
bc1:=subs(diff(u(x,y),x)=subs(m=0,dydxf),u(x,y)=u[0](zeta),x=0,b
c1);
>
bc2:=subs(diff(u(x,y),x)=subs(m=N+1,dydxb),u(x,y)=u[N+1](zeta),x
=1,bc2);
Enter the number of interior node points:
> N:=2;
> eq[0]:=bc1;
> eq[N+1]:=bc2;
Convert the governing equation to finite difference from (equation 6.1.12):
> 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
;
Enter the boundary values:
> u[0](zeta):=(solve(eq[0],u[0](zeta)));
> u[N+1](zeta):=solve(eq[N+1],u[N+1](zeta));
> for i from 1 to N do
eq[i]:=diff(u[i](zeta),zeta)=u[N+1+i](zeta);od;
> 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;
Generate the A matrix using the governing equations and the dependent variables.
> 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)];
> A:=genmatrix(eqns,Y,'b1');
Convert the entries of the A matrix as decimals if N is greater than two (as in chapter 5.1):
> if N>2 then A:=map(evalf,A):end;
A Maple procedure is written to expedite the calculation for the exponential matrix (see chapter
5.1). First the eigenvalues are found:
>
>
Error, illegal use of an object as a name
Note that this procedure can be used only if all the eigenvalues are real and distinct. Also, for
obtaining the eigenvectors (equation 5.26) since  s are coupled, all of the equations are solved
simultaneously. (In chapter 5.1, the equations for  s were solved individually one-by one.
> evalm(A);
> b:=matrix(2*N,1):for i from 1 to 2*N do
b[i,1]:=-b1[i];od:evalm(b);
Note that for the example given the b vector is zero. However, depending on the boundary
conditions, bc3 and bc3, the b vector can be a function of ζ or a constant vector.
> h:=eval(1/(N+1));
> J:=jordan(A,S);
>
>
>
>
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):
The initial condition vector is defined here.
> Y0:=matrix(2*N,1);
> 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);
The solution is found by adding the nonhomogeneous part to the homogeneous part.
> Y:=evalm(mat&*Y0+mat3):
The solution at y = 0 and y = 1 is stored in sol0 and sol1 to calculate the unknown constants.
> sol0:=map(eval,evalm(subs(zeta=0,evalm(Y)))):
> sol1:=map(eval,evalm(subs(zeta=epsilon/h,evalm(Y)))):
Now the boundary conditions bc3 and bc4 are applied.
> 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;
> 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;
The unknown constants are solved as:
> csol:=solve({seq(Eq[i],i=1..2*N)},{seq(c[i],i=1..N),seq(p[i],
i=1..N)});
>
>
>
>
>
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;
Hence, the semianalytical solution is obtained for temperature distribution. The plots obtained
for N=10 node points is given below:
> 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);
> 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;
> T1:=[seq(evalf(i/M),i=0..M)];
> 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=li
ne,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,spri
ntf("=%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]);
Error:TEXT location must be numeric; received: [.5, u[5](.1000000000)]
> Ny:=30;
> PP:=matrix(N+2,Ny);
> 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] );
>