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 work of 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] );
>