1
CHAPTER 27
27.1 The solution can be assumed to be T = ex. This, along with the second derivative T” = 2ex,
can be substituted into the differential equation to give
2e x 0.15e x 0
which can be used to solve for
2 0.15 0
0.15
Therefore, the general solution is
T Ae 0.15 x
Be 0.15 x
The constants can be evaluated by substituting each of the boundary conditions to generate
two equations with two unknowns,
240 A B
150 48.08563A 0.020796B
which can be solved for A = 3.016944 and B = 236.9831. The final solution is, therefore,
T 3.016944e 0.15 x
236.9831e 0.15 x
which can be used to generate the values below:
x T
0 240
1 165.329
2 115.7689
3 83.79237
4 64.54254
5 55.09572
6 54.01709
7 61.1428
8 77.55515
9 105.7469
10 150
2
27.3 A centered finite difference can be substituted for the second derivative to give,
Ti 1 2Ti Ti 1
0.15Ti 0
h2
or for h = 1,
Ti 1 2.15Ti Ti 1 0
The first node would be
2.15T1 T2 240
and the last node would be
T9 2.15T10 150
The tridiagonal system can be solved with the Thomas algorithm or Gauss-Seidel for (the
analytical solution is also included)
x T Analytical
0 240 240
1 165.7573 165.3290
2 116.3782 115.7689
3 84.4558 83.7924
4 65.2018 64.5425
5 55.7281 55.0957
6 54.6136 54.0171
7 61.6911 61.1428
8 78.0223 77.5552
9 106.0569 105.7469
10 150 150
The following plot of the results (with the analytical shown as filled circles) indicates close
agreement.
3
27.5 Centered finite differences can be substituted for the second and first derivatives to give,
y i 1 2 y i y i 1 y i 1 y i 1
7 2 y i xi 0
x 2
2x
or substituting x = 2 and collecting terms yields
2.25 y i 1 4.5 y i 1.25 y i 1 xi
This equation can be written for each node and solved with methods such as the Tridiagonal
solver, the Gauss-Seidel method or LU Decomposition. The following solution was computed
using Excel’s Minverse and Mmult functions:
x y
0 5
2 4.199592
4 4.518531
6 5.507445
8 6.893447
10 8.503007
12 10.20262
14 11.82402
16 13.00176
18 12.7231
20 8
4
27.7 The second-order ODE can be linearized as in
d 2T
1 10 7 (Tb 273) 4 4 10 7 (Tb 273) 3 (T Tb ) 4(150 T ) 0
dx 2
Substituting Tb = 150 and collecting terms gives
d 2T
34.27479T 1939.659 0
dx 2
Substituting a centered-difference approximation of the second derivative gives
Ti 1 ( 2 34.27479x 2 )Ti Ti 1 1939.659x 2
We used the Gauss-Seidel method to solve these equations. The results for a few selected
points are:
x 0 0.1 0.2 0.3 0.4 0.5
T 200 138.8337 106.6616 92.14149 90.15448 100
A graph of the entire solution along with the nonlinear result from Prob. 27.7 is shown below:
250
200
150 Linear
100
50 Nonlinear
0
0 0.1 0.2 0.3 0.4 0.5
27.9 For 5 interior points (h = 3/6 = 0.5), the result is Eq. (27.19) with 2 0.25p2 on the diagonal.
Dividing by 0.25 gives,
8 p 2 4
4 8 p2 4
4 8 p2 4 0
4 8 p 2
4
4 8 p2
The determinant can be expanded (e.g., with Fadeev-Leverrier or the MATLAB poly
function) to give
0 p 10 40 p 8 576 p 6 3,584 p 4 8960 p 2 6,144
5
The roots of this polynomial can be determined as (e.g., with Bairstow’s methods or the
MATLAB roots function) p2 = 1.072, 4, 8, 12, 14.94. The square root of these roots yields p =
1.035, 2, 2.828, 3.464, and 3.864.
27.11 Although the following computation can be implemented on a pocket calculator, a
spreadsheet or with a program, we’ve used MATLAB.
>> a=[2 8 10;8 4 5;10 5 7]
a =
2 8 10
8 4 5
10 5 7
>> x=[1 1 1]'
x =
1
1
1
First iteration:
>> x=a*x
x =
20
17
22
>> e=max(x)
e =
22
>> x=x/e
x =
0.9091
0.7727
1.0000
Second iteration:
>> x=a*x
x =
18.0000
15.3636
19.9545
>> e=max(x)
e =
19.9545
>> x=x/e
x =
0.9021
0.7699
1.0000
Third iteration:
>> x=a*x
x =
17.9636
15.2961
19.8702
>> e=max(x)
e =
6
19.8702
>> x=x/e
x =
0.9040
0.7698
1.0000
Fourth iteration:
>> x=a*x
x =
17.9665
15.3116
19.8895
>> e=max(x)
e =
19.8895
>> x=x/e
x =
0.9033
0.7698
1.0000
Thus, after four iterations, the result is converging on a highest eigenvalue of 19.8842 with a
corresponding eigenvector of [0.9035 0.7698 1].
27.13 Here is VBA Code to implement the shooting method:
Option Explicit
Sub Shoot()
Dim n As Integer, m As Integer, i As Integer, j As Integer
Dim x0 As Double, xf As Double
Dim x As Double, y(2) As Double, h As Double, dx As Double, xend As Double
Dim xp(200) As Double, yp(2, 200) As Double, xout As Double
Dim z01 As Double, z02 As Double, T01 As Double, T02 As Double
Dim T0 As Double, Tf As Double
Dim Tf1 As Double, Tf2 As Double
'set parameters
n = 2
x0 = 0
T0 = 40
xf = 10
Tf = 200
dx = 2
xend = xf
xout = 2
'first shot
x = x0
y(1) = T0
y(2) = 10
Call RKsystems(x, y, n, dx, xf, xout, xp, yp, m)
z01 = yp(2, 0)
Tf1 = yp(1, m)
'second shot
x = x0
y(1) = T0
y(2) = 20
Call RKsystems(x, y, n, dx, xf, xout, xp, yp, m)
z02 = yp(2, 0)
Tf2 = yp(1, m)
'last shot
7
x = x0
y(1) = T0
'linear interpolation
y(2) = z01 + (z02 - z01) / (Tf2 - Tf1) * (Tf - Tf1)
Call RKsystems(x, y, n, dx, xf, xout, xp, yp, m)
'output results
Range("A4:C1004").ClearContents
Range("A4").Select
For j = 0 To m
ActiveCell.Value = xp(j)
For i = 1 To n
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = yp(i, j)
Next i
ActiveCell.Offset(1, -n).Select
Next j
Range("A4").Select
End Sub
Sub RKsystems(x, y, n, dx, xf, xout, xp, yp, m)
Dim i As Integer
Dim xend As Double, h As Double
m = 0
For i = 1 To n
yp(i, m) = y(i)
Next i
Do
xend = x + xout
If xend > xf Then xend = xf
h = dx
Do
If xend - x < h Then h = xend - x
Call RK4(x, y, n, h)
If x >= xend Then Exit Do
Loop
m = m + 1
xp(m) = x
For i = 1 To n
yp(i, m) = y(i)
Next i
If x >= xf Then Exit Do
Loop
End Sub
Sub RK4(x, y, n, h)
Dim i
Dim ynew, dydx(10), ym(10), ye(10)
Dim k1(10), k2(10), k3(10), k4(10)
Dim slope(10)
Call Derivs(x, y, k1)
For i = 1 To n
ym(i) = y(i) + k1(i) * h / 2
Next i
Call Derivs(x + h / 2, ym, k2)
For i = 1 To n
ym(i) = y(i) + k2(i) * h / 2
Next i
Call Derivs(x + h / 2, ym, k3)
For i = 1 To n
ye(i) = y(i) + k3(i) * h
Next i
Call Derivs(x + h, ye, k4)
For i = 1 To n
8
slope(i) = (k1(i) + 2 * (k2(i) + k3(i)) + k4(i)) / 6
Next i
For i = 1 To n
y(i) = y(i) + slope(i) * h
Next i
x = x + h
End Sub
Sub Derivs(x, y, dydx)
dydx(1) = y(2)
dydx(2) = 0.01 * (y(1) - 20)
End Sub
27.15 A general formulation that describes Example 27.3 as well as Probs. 27.3 and 27.5 is
d2y dy
a 2
b cy f ( x) 0
dx dx
Finite difference approximations can be substituted for the derivatives:
y i 1 2 y i y i 1 y y i 1
a b i 1 cyi f ( xi ) 0
x 2
2x
Collecting terms
a 0.5bx y i 1 2a cx 2 y i a 0.5bx y i 1 f ( x i )x 2
Dividing by x2,
a / x 2 0.5b / x y i 1 2a / x 2 c y i a / x 2 0.5b / x y i 1 f ( xi )
For Example 27.3, a = 1, b = 0, c = h and f(x) = hTa. The following VBA code implements
Example 27.3.
Public hp As Double
Option Explicit
Sub FDBoundaryValue()
Dim ns As Integer, i As Integer
Dim a As Double, b As Double, c As Double
9
Dim e(100) As Double, f(100) As Double, g(100) As Double, r(100) As Double,
y(100) As Double
Dim Lx As Double, xx As Double, x(100) As Double, dx As Double
Lx = 10
dx = 2
ns = Lx / dx
xx = 0
For i = 0 To ns
x(i) = xx
xx = xx + dx
Next i
hp = 0.01
a = 1
b = 0
c = -hp
y(0) = 40
y(ns) = 200
f(1) = 2 * a / dx ^ 2 - c
g(1) = -(a / dx ^ 2 + b / (2 * dx))
r(1) = ff(x(1)) + (a / dx ^ 2 - b / (2 * dx)) * y(0)
For i = 2 To ns - 2
e(i) = -(a / dx ^ 2 - b / (2 * dx))
f(i) = 2 * a / dx ^ 2 - c
g(i) = -(a / dx ^ 2 + b / (2 * dx))
r(i) = ff(x(i))
Next i
e(ns - 1) = -(a / dx ^ 2 - b / (2 * dx))
f(ns - 1) = 2 * a / dx ^ 2 - c
r(ns - 1) = ff(x(ns - 1)) + (a / dx ^ 2 + b / (2 * dx)) * y(ns)
Sheets("Sheet2").Select
Range("a5:d105").ClearContents
Range("a5").Select
For i = 1 To ns - 1
ActiveCell.Value = e(i)
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = f(i)
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = g(i)
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = r(i)
ActiveCell.Offset(1, -3).Select
Next i
Range("a5").Select
Call Tridiag(e, f, g, r, ns - 1, y)
Sheets("Sheet1").Select
Range("a5:b105").ClearContents
Range("a5").Select
For i = 0 To ns
ActiveCell.Value = x(i)
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = y(i)
ActiveCell.Offset(1, -1).Select
Next i
Range("a5").Select
End Sub
Sub Tridiag(e, f, g, r, n, x)
Dim k As Integer
For k = 2 To n
e(k) = e(k) / f(k - 1)
f(k) = f(k) - e(k) * g(k - 1)
Next k
For k = 2 To n
10
r(k) = r(k) - e(k) * r(k - 1)
Next k
x(n) = r(n) / f(n)
For k = n - 1 To 1 Step -1
x(k) = (r(k) - g(k) * x(k + 1)) / f(k)
Next k
End Sub
Function ff(x)
ff = hp * 20
End Function
27.17 The following two codes can be used to solve this problem. The first is written in
VBA/Excel. The second is an M-file implemented in MATLAB.
VBA/Excel:
Option Explicit
Sub Power()
Dim n As Integer, i As Integer, iter As Integer
Dim aa As Double, bb As Double
Dim a(10, 10) As Double, c(10) As Double
Dim lam As Double, lamold As Double, v(10) As Double
Dim es As Double, ea As Double
es = 0.001
n = 3
aa = 2 / 0.5625
bb = -1 / 0.5625
a(1, 1) = aa
a(1, 2) = bb
For i = 2 To n - 1
a(i, i - 1) = bb
a(i, i) = aa
a(i, i + 1) = bb
Next i
a(i, i - 1) = bb
a(i, i) = aa
lam = 1
For i = 1 To n
v(i) = lam
Next i
Sheets("sheet1").Select
Range("a3:b1000").ClearContents
Range("a3").Select
Do
iter = iter + 1
Call Mmult(a, (v), v, n, n, 1)
11
lam = Abs(v(1))
For i = 2 To n
If Abs(v(i)) > lam Then lam = Abs(v(i))
Next i
ActiveCell.Value = "iteration: "
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = iter
ActiveCell.Offset(1, -1).Select
ActiveCell.Value = "eigenvalue: "
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = lam
ActiveCell.Offset(1, -1).Select
For i = 1 To n
v(i) = v(i) / lam
Next i
ActiveCell.Value = "eigenvector:"
ActiveCell.Offset(0, 1).Select
For i = 1 To n
ActiveCell.Value = v(i)
ActiveCell.Offset(1, 0).Select
Next i
ActiveCell.Offset(1, -1).Select
ea = Abs((lam - lamold) / lam) * 100
lamold = lam
If ea <= es Then Exit Do
Loop
End Sub
Sub Mmult(a, b, c, m, n, l)
Dim i As Integer, j As Integer, k As Integer
Dim sum As Double
For i = 1 To n
sum = 0
For k = 1 To m
sum = sum + a(i, k) * b(k)
Next k
c(i) = sum
Next i
End Sub
12
MATLAB:
function [e, v] = powmax(A)
% [e, v] = powmax(A):
% uses the power method to find the highest eigenvalue and
% the corresponding eigenvector
% input:
% A = matrix to be analyzed
% output:
% e = eigenvalue
% v = eigenvector
es = 0.0001;
maxit = 100;
n = size(A);
for i=1:n
v(i)=1;
end
v = v';
e = 1;
iter = 0;
while (1)
13
eold = e;
x = A*v;
[e,i] = max(abs(x));
e = sign(x(i))*e;
v = x/e;
iter = iter + 1;
ea = abs((e - eold)/e) * 100;
if ea <= es | iter >= maxit, break, end
end
Application to solve Example 27.7,
>> A=[3.556 -1.778 0;-1.778 3.556 -1.778;0 -1.778 3.556];
>> [e,v]=powmax(A)
e =
6.0705
v =
-0.7071
1.0000
-0.7071
27.19 This problem can be solved by recognizing that the solution corresponds to driving the
differential equation to zero. To do this, a finite difference approximation can be substituted
for the second derivative to give
Ti 1 2Ti Ti 1
R 2
1 10 7 (Ti 273) 4 4(150 Ti )
(x)
where R = the residual, which is equal to zero when the equation is satisfied. Next, a
spreadsheet can be set up as below. Guesses for T can be entered in cells B11:B14. Then, the
residual equation can be written in cells C11:C14 and referenced to the temperatures in
column B. The square of the R’s can then be entered in column D and summed (D17).
= sum(D11:D14)
=(B10-2*B11+B12)/$B$7^2-$B$2*(B11+273)^4+$B$3*($B$4-B11)
Solver can then be invoked to drive cell D17 to zero by varying B11:B14.
14
The result is as shown in the spreadsheet along with a plot.
27.21 (a) First, the 2nd-order ODE can be reexpressed as the following system of 1st-order
ODE’s
dx
z
dt
dz
8 z 1200 x
dt
Next, we create an M-file to hold the ODEs:
function dx=spring(t,y)
dx=[y(2);-8*y(2)-1200*y(1)]
Then we enter the following commands into MATLAB
[t,y]=ode45('spring',[0 .4],[0.5;0]);
plot(t,y(:,1));
The following plot results:
15
(b) The eigenvalues and eigenvectors can be determined with the following commands:
>> a=[0 -1;8 1200];
>> format short e
>> [v,d]=eig(a)
v =
-9.9998e-001 8.3334e-004
6.6666e-003 -1.0000e+000
d =
6.6667e-003 0
0 1.2000e+003
27.23 Boundary Value Problem
1. x-spacing
at x = 0, i = l; and at x = 2, i = n
20
x
n 1
2. Finite Difference Equation
d 2u du
2
6 u 2
dx dx
Substitute finite difference approximations:
u i 1 2u i u i 1 u i 1 u i 1
6 ui 2
x 2
2x
[1 3(x)]u i 1 [2 x 2 ]u i [1 3(x )]u i 1 2x 2
16
Coefficients:
ai = 1 – 3x bi = –2 – x2 ci = 1 + 3x di = 2x2
3. End point equations
i = 2:
[1 3(x)]10 [2 x 2 ]u 2 [1 3(x)]u 3 2x 2
Coefficients:
a2 = 0 b2 = –2 – x2 c2 = 1 + 3x d2 = 2x2 – 10(1 – 3(x))
i = n – 1:
[1 3(x)]u n 2 [2 x 2 ]u n 1 [1 3(x )]1 2x 2
Coefficients:
a2 = 1 – 3x b2 = –2 – x2 c2 = 0 d2 = 2x2 – (1 – 3(x))
% Boundary Value Problem
% u[xx]+6u[x]-u=2
% BC: u(x=0)=10 u(x=2)=1
% i=spatial index from 1 to n
% numbering for points is i=l to i=21 for 20 dx spaces
% u(1)=10 and u(n)=1
n=41; xspan=2.0;
% Constants
dx=xspan/(n-1);
dx2=dx*dx;
% Sizing matrices
u=zeros(1,n); x=zeros(1,n);
a=zeros(1,n); b=zeros(1,n); c=zeros(1,n); d=zeros(1,n);
ba=zeros(1,n); ga=zeros(1,n);
% Coefficients and Boundary Conditions
x=0:dx:2;
u(1)=10; u(n)=1;
b(2)=-2-dx2;
c(2)=1+3*dx;
d(2)=2*dx2-(1-3*dx)*10;
for i=3:n-2
a(i)=1-3*dx;
b(i)=-2-dx2;
c(i)=1+3*dx;
d(i)=2*dx2;
end
a(n-1)=1-3*dx;
b(n-1)=-2-dx2;
d(n-1)=2*dx2-(1+3*dx);
% Solution by Thomas Algorithm
17
ba(2)=b(2);
ga(2)=d(2)/b(2);
for i=3:n-1
ba(i)=b(i)-a(i)*c(i-1)/ba(i-1);
ga(i)=(d(i)-a(i)*ga(i-1))/ba(i);
end
% back substitution
u(n-1)=ga(n-1);
for i=n-2:-1:2
u(i)=ga(i)-c(i)*u(i+1)/ba(i);
end
% Plot
plot(x,u)
title('u[xx]+6u[x]-u=2; u(x=0)=10, u(x=2)=1')
xlabel('x-Independent Variable Range 0 to 2');ylabel('u-Dependent
Variable')
grid
27.25 By summing forces on each mass and equating that to the mass times acceleration, the
resu1ting differential equations can be written
k k2 k
x1 1 x1 2 x 2 0
m1 m1
k k k3 k
x2 2 x1 2 x 2 3 x3 0
m2 m2 m2
k k k4
x3 3 x 2 3 x3 0
m3 m3
In matrix form
18
k1 k 2 k2
0
m1 m1
x1 k 3 x1 0
k2 k2 k3
x2 x 2 0
m m m
x3 2 2 2
x3 0
0 k k k 4
3 3
m3 m3
The k/m matrix becomes with: k1 = k4 = 15 N/m, k2 = k3 = 35 N/m, and m1 = m2 = m3 = 1.5 kg
k 33.33333 23.33333 0
m 23.33333 46.66667 23.33333
0 23.33333 33.33333
Solve for the eigenva1ues/natural frequencies using MATLAB:
>> k1=15;k4=15;k2=35;k3=35;
>> m1=1.5;m2=1.5;m3=1.5;
>> a=[(k1+k2)/m1 -k2/m1 0;
-k2/m2 (k2+k3)/m2 -k3/m2;
0 -k3/m3 (k3+k4)/m3]
a =
33.3333 -23.3333 0
-23.3333 46.6667 -23.3333
0 -23.3333 33.3333
>> w2=eig(a)
w2 =
6.3350
33.3333
73.6650
>> w=sqrt(w2)
w =
2.5169
5.7735
8.5828
27.27 (a) The exact solution is
y Ae 5t t 2 0.4t 0.08
If the initial condition at t = 0 is 0.8, A = 0,
y t 2 0.4t 0.08
19
Note that even though the choice of the initial condition removes the positive exponential
terms, it still lurks in the background. Very tiny round off errors in the numerical solutions
bring it to the fore. Hence all of the following solutions eventually diverge from the analytical
solution.
(b) 4th order RK. The plot shows the numerical solution (bold line) along with the exact
solution (fine line).
15
10
-5
0 1 2 3 4
-10
(c)
function yp=dy(t,y)
yp=5*(y-t^2);
>> tspan=[0,5];
>> y0=0.08;
>> [t,y]=ode45('dy1',tspan,y0);
(d)
>> [t,y]=ode23S('dy1',tspan,y0);
(e)
>> [t,y]=ode23TB('dy1',tspan,y0);
27.29 First, the 2nd-order ODE can be reexpressed as the following system of 1st-order ODE’s
20
dT
z
dx
dz
(0.12 x 3 2.4 x 2 12 x)
dx
(a) Shooting method: These can be solved for two guesses for the initial condition of z. For
our cases we used –1 and 0.5. We solved the ODEs with the 4th-order RK method using a
step size of 0.125. The results are
z(0) 1 0.5
T(10) 570 565
These values can then be used to derive the correct initial condition,
0 .5 1
z ( 0) 1 ( 200 ( 570)) 76
565 (570)
The resulting fit is displayed below:
(b) Finite difference: Centered finite differences can be substituted for the second and first
derivatives to give,
Ti 1 2Ti Ti 1
2
0.12 xi3 2.4 xi2 12 xi 0
x
or substituting x = 2 and collecting terms yields
Ti 1 2Ti Ti 1 x 2 (0.12 xi3 2.4 x i2 12 xi )
This equation can be written for each node with the result
21
2 1 0 0 T1 101.44
1 2 1 0 T2 69.12
0 1 2 1 T3 46.08
0 0 1 2 T 215.36
4
These equations can be solved with methods such as the tridiagonal solver, the Gauss-Seidel
method or LU Decomposition. The following solution was computed using Excel’s Minverse
and Mmult functions: