31hotDisk.mws

Partial Differential Equations PowerTool

by Dr. Jim Herod

Section 7.3: Heat Equation on a Disk

Maple Packages for Section 7.3

>    restart:

>    with(plots):

Warning, the name changecoords has been redefined

>   

     We consider the diffusion equation on a disk. The physical situation is that of either a long circular beam, or a disk with insulated top and bottom, but with a fixed temperature on the sides, and an initial temperature throughout the disk. This can be written as

          1/k diff(u,t)  = Delta  u,

with u(t, a, theta  ) = f( theta  ),   0 < t,    -pi  < theta  < Pi  

and    u(0, r, theta  ) = g( r, theta  ),    0 <= r  < a,     -pi  < theta  < Pi  .

     To do this problem, we first solve the steady state problem

          0 = Delta  v,  v(a, theta  ) = f( theta  ),   -pi  < theta  < Pi  .

Then solve the transient problem

          1/k diff(u,t)  = Delta  u,

with u(t, a, theta  ) = 0,  0 < t,   -pi  < theta  < Pi  

and    u(0, r, theta  ) = g( r, theta  ) - v(r, theta )  , 0 <= r  < a,   -pi  < theta  < Pi  .

     Finally, the solution for the original problem is the sum of these two.

     We have already studied how to solve the first problem in Sections 6.4 and 6.5. Here is how to think of solving the second problem. We write out the partial differential equation in unabbreviated form to facilitate separation of variables.

                      diff(r*diff(u(r,theta),r),r)/r+diff(u(r,theta),`$`(theta,2))/(r^2)   = diff(u,t) .

(We have dropped the constant of diffusion for purposes of illustration.) Separation of variables leads to these three differential equations with boundary conditions:

(1)   Theta  '' + mu^2*Theta  = 0,   Theta(Pi)  = Theta(-Pi) ,   Theta  '( Pi  ) = Theta  '( -Pi ),

(2)   T ' = - lambda^2  T,  and

(3)   r ( r R ' ) ' - mu^2  R = - lambda^2   r^2  R,  R(a) = 0,  R is bounded on [0, a).

We know how to solve (1) and (2). Equation 3 leads to a study of Bessel's functions.

     To begin this study, we start with an example that is independent of Theta . Here is the problem we solve

                diff(u,t)  = Delta  u,

with   u(t, a, theta  ) = 0,  0 < t,   -pi  < theta  < Pi  

and    u(0, r, theta  ) = g( r),    0 <= r  < a,   -pi  < theta  < Pi  .

Is it clear that the solution of this equation will be independent of theta  ? Thus, the partial differential equation reduces to

                 diff(r*diff(u(r,theta),r),r)/r   = diff(u,t) .

Now we have the two differential equations

(1) T ' + lambda^2  T = 0, and

(2) r ( r R ' ) ' + lambda^2   r^2  R = 0, with R(a) = 0, and R bounded on [0, a).

     We examine the second differential equation. Expanded, it is

           r^2  R '' + r R ' + lambda^2   r^2  R = 0.

We ask Maple to solve this equation. Commonly, the solutions are introduced in elementary differential equations in a discussion of series. We are, as you know, assuming that lambda  > 0. Maple would be assuming only that it is complex, unless we tell it to do otherwise.

>    assume(lambda>0);

>    dsolve(r^2*diff(R(r),r,r)+ r*diff(R(r),r)+lambda^2*r^2*R(r)=0,R(r),series);

R(r) = _C1*(series(1+(-1/4*lambda^2)*r^2+1/64*lambda^4*r^4+O(r^6),r,6))+_C2*(ln(r)*(series(1+(-1/4*lambda^2)*r^2+1/64*lambda^4*r^4+O(r^6),r,6))+(series(1/4*lambda^2*r^2+(-3/128*lambda^4)*r^4+O(r^6),r,6...

Of course, Maple knows the solutions in the full details, without truncated series. We ask for solutions, again, and do not ask that the solutions be as series.

>    dsolve(r^2*diff(R(r),r,r)+ r*diff(R(r),r)+lambda^2*r^2*R(r)=0,R(r));

R(r) = _C1*BesselJ(0,lambda*r)+_C2*BesselY(0,lambda*r)

It seems we have two solutions. To understand the Bessel functions, we draw their graphs.

>    plot([BesselY(0,r),BesselJ(0,r)],r=0..10,color=[BLACK,RED]);

[Maple Plot]

There are several observations to make:

(1) BesselJ(0, r) is one at zero and BesselY(0, r) is unbounded at zero.
(2) The two solutions oscillate, are not periodic, and have intertwining zeros.
(3) These form eigenfunctions corresponding to the eigenvalues -
lambda^2  for the differential operator

          L(R) = 1/r  ( r R ' ) '.

Here's a check of this last.

>    R:=r->BesselY(0,lambda*r);
1/r*(diff(r*diff(R(r),r),r))+lambda^2*R(r);
simplify(%);

R := proc (r) options operator, arrow; BesselY(0,lambda*r) end proc

1/r*(-BesselY(1,lambda*r)*lambda-r*(BesselY(0,lambda*r)-1/lambda/r*BesselY(1,lambda*r))*lambda^2)+lambda^2*BesselY(0,lambda*r)

0

 

>    R:=r->BesselJ(0,lambda*r);
1/r*(diff(r*diff(R(r),r),r))+lambda^2*R(r);
simplify(%);

R := proc (r) options operator, arrow; BesselJ(0,lambda*r) end proc

1/r*(-BesselJ(1,lambda*r)*lambda-r*(BesselJ(0,lambda*r)-1/lambda/r*BesselJ(1,lambda*r))*lambda^2)+lambda^2*BesselJ(0,lambda*r)

0

     It is of value to compare these two functions with the cosine and sine functions, which define the eigenfunctions for the problem Theta  '' + lambda^2   Theta  = 0. The comparison helps to crystallize the structure in your memory.  Since we are interested in only bounded solutions on the disk, we set aside BesselY.  

     Suppose a > 0. Take J(r) to be BesselJ

Comparison 1:  There is an infinite increasing sequence lambda[1]  ,   lambda[2]  ,   lambda[3]  ,  ...  such that J( lambda[p]  a) = 0. For the cosine function, these numbers were n*Pi/a  .

Comparison 2:  The numbers  - lambda[j]^2  are eigenvalues and R(r) = J( lambda[j]  r) is an eigenfunction for the operator L(R)  defined above with R(a) = 0. The function cos( n*Pi/a  x ) was an eigenfunction for Theta  '' with Theta  (a) = 0.

Comparison 3:  Orthogonality persists in the sense that

           int(J(lambda[j]*x)*J(lambda[k]*x)*x,x = 0 .. a)  = 0 if j <> k    and    int(J(lambda[j]*x)^2*x,x = 0 .. a)  = a^2/2  J ' (lambda[j]*a)^2  .

Comparison 4:  If f(r) is sectionally smooth on (0, a) then

    

          f(r) = sum(a[n]*J(lambda[n]*r),n)  where a[n]  = <f(r), J( lambda[n]  r) >/ abs(J(lambda[n]^2*r))^2

In this case, the dotproduct is defined by    `<,>`(f,g)  = int(f(x)*g(x)*x,x = 0 .. a)  with the associated norm.

It seems appropriate to do an example. We take the boundary conditions to be zero so that we will not have to do the steady state problem first. We take the initial condition to be 1-r^2  so that the initial condition is independent of theta . With a = 1, we will have a continuous function on the unit disk.

      Here is a graph of the initial condition.     

>    f:=r->1-r^2;

f := proc (r) options operator, arrow; 1-r^2 end proc

>    cylinderplot([r,theta,f(r)],theta=-Pi..Pi,r=0..1,axes=NORMAL, shading=zhue);

[Maple Plot]

>   

     Your expectation is that the initial distribution will decay to the steady state u(r, theta  ) = 0. Here are the details.

The first thing to do is to get the zeros of R(r) = BesselJ(r). We can create a program to compute these. Go back to the graph and see how far the zeros are apart. Then, solve for a zero in an interval.

>    zero[0]:=0;
for n from 1 to 4 do
     zero[n]:=fsolve(BesselJ(0,x)=0,x,zero[n-1]+1..zero[n-1]+4);
end do;
n:='n';

zero[0] := 0

zero[1] := 2.404825558

zero[2] := 5.520078110

zero[3] := 8.653727913

zero[4] := 11.79153444

n := 'n'

Pretty good. No surprise. These zeros are so important that Maple already knows them.

>    for n from 1 to 10 do
    zero[n]:=evalf(BesselJZeros(0,n));
end do;
n:='n';

zero[1] := 2.404825558

zero[2] := 5.520078110

zero[3] := 8.653727913

zero[4] := 11.79153444

zero[5] := 14.93091771

zero[6] := 18.07106397

zero[7] := 21.21163663

zero[8] := 24.35247153

zero[9] := 27.49347913

zero[10] := 30.63460647

n := 'n'

>   

To make further comparisons, we plot the first six of the eigenfuntions cos( n*Pi/a  x) and the first six of the eigenfunctions BesselJ(0, lambda[n]/a  x).

>    plot([seq(cos(n*Pi*x),n=0..5)],x=0..1,color=[black,red,green,blue,yellow, brown]);

[Maple Plot]

>    plot([seq(BesselJ(0,zero[n]*x),n=0..5)],x=0..1,color=[black,red,green,blue,yellow, brown]);

[Maple Plot]

Let's check the orthogonality. In order to meet the boundary conditions that R is bounded and R(a) is zero, we need the positive zeros of the BesselJ(0, x) function. What you should expect is that we don't get exactly zero, for each zero is only an approximation.

>    for n from 1 to 3 do
  for m from 1 to 3 do
     print(int(BesselJ(0,zero[n]*x)*BesselJ(0,zero[m]*x)*x,x=0..1));
  end do;
end do;
n:='n':m:='m':

.1347570619

.1694264325e-10

-.4932465960e-11

.1694264325e-10

.5789006930e-1

-.6173982676e-11

-.4932465960e-11

-.6173982676e-11

.3684317557e-1

Now is time to compute the coefficients.

>    for n from 1 to 10 do
   A[n]:=int(f(x)*BesselJ(0,zero[n]*x)*x,x=0..1)/
               int(BesselJ(0,zero[n]*x)*BesselJ(0,zero[n]*x)*x,x=0..1);
end do;
n:='n':

A[1] := 1.108022262

A[2] := -.1397775052

A[3] := .4547647069e-1

A[4] := -.2099090194e-1

A[5] := .1163624313e-1

A[6] := -.7221175738e-2

A[7] := .4837871926e-2

A[8] := -.3425679000e-2

A[9] := .2529529971e-2

A[10] := -.1930146611e-2

The next two graphs are so close, I offset the first one by 0.007.

>    plot([f(x)+0.007,sum(A[n]*BesselJ(0,zero[n]*x),n=1..10)],x=0..1,
       color=[black,red]);

[Maple Plot]

We now create the solution.

>    u:=(t,r)->sum(A[n]*BesselJ(0,zero[n]*r)*exp(-zero[n]^2*t),n=1..10);

u := proc (t, r) options operator, arrow; sum(A[n]*BesselJ(0,zero[n]*r)*exp(-zero[n]^2*t),n = 1 .. 10) end proc

>    cylinderplot([r,theta,u(1,r)],r=0..1,theta=-Pi..Pi,axes=NORMAL, shading=zhue);

[Maple Plot]

>    animate3d([r,theta,u(t,r)],r=0..1,theta=-Pi..Pi,t=0..1,
            coords=cylindrical, frames=30, shading=zhue);

[Maple Plot]

We remark in passing that the following is an alternate way to do a cylinder plot that does not require a call of the package "plots".

>    plot3d([r,theta,u(0,r)],r=0..1,theta=-Pi..Pi,coords=cylindrical, shading=zhue);

[Maple Plot]

>   

Verify the Solution

I emphasize that solutions should be checked. Here, I show that a solution of the form

     u(t, r) = sum(A[n]*BesselJ(0,zero[n]*r)*exp(-zero[n]^2*t),n = 1 .. infinity)

is a solution for the equation for 0 < r < 1, and t > 0.  If the interval were 0 < r < a, we take

    u(t, r) = sum(A[n]*BesselJ(0,zero[n]*r/a)*exp(-zero[n]^2*t/(a^2)),n = 1 .. infinity) .

Here is a verification in case we sum only to 3. I incorporate the 1/a in the term zero[n]  .

>    restart;

>    for n from 1 to 3 do
     zero[n]:=BesselJZeros(0,n)/a;
end do;
n:='n';

zero[1] := BesselJZeros(0,1)/a

zero[2] := BesselJZeros(0,2)/a

zero[3] := BesselJZeros(0,3)/a

n := 'n'

>    u:=(t,r)->sum(A[n]*BesselJ(0,zero[n]*r)*exp(-zero[n]^2*t),
            n=1..3);

u := proc (t, r) options operator, arrow; sum(A[n]*BesselJ(0,zero[n]*r)*exp(-zero[n]^2*t),n = 1 .. 3) end proc

>    u(t,a);
simplify(diff(u(t,r),t)-1/r*diff(r*diff(u(t,r),r),r));

0

0

EMAIL: herod@math.gatech.edu   or   jherod@tds.net

URL: http://www.math.gatech.edu/~herod

Copyright ©  2003  by James V. Herod

All rights reserved