Chapter 2

f_02_03.jl

Gaussian elimination using LDLt factorization

Other versions: j_02_03.jl, nm23.jl


In [1]:
using NMfE

In [2]:
A=Float64[16 4 8;4 5 -4;8 -4 22];

In [3]:
b=Float64[4, 2, 5];

In [4]:
n = size(A, 1)
d = zeros(n);

In [5]:
ldlt!(A, d)

In [6]:
lower = zeros(3, 3)
for i in 1:n
  for j in 1:i
    lower[i, j] = A[i, j] / d[j]
  end
end

In [7]:
# Lower Triangular Factors:
lower


Out[7]:
3x3 Array{Float64,2}:
 1.0    0.0  0.0
 0.25   1.0  0.0
 0.5   -1.5  1.0

In [8]:
# Diagonal Terms
d


Out[8]:
3-element Array{Float64,1}:
 16.0
  4.0
  9.0

In [9]:
# Forward substitution
ldlfor!(A, b)
for i in 1:n
  A[i, :] = A[i, :] / d[i]
end

In [10]:
# Backward substitution
subbac!(A, b)
# Solution Vector
b


Out[10]:
3-element Array{Float64,1}:
 -0.25
  1.0 
  0.5 

In [11]:
d = copy(b)   # Copy b to d, reset both A and b
A=Float64[16 4 8;4 5 -4;8 -4 22]
b=Float64[4, 2, 5]
c = A\b


Out[11]:
3-element Array{Float64,1}:
 -0.25
  1.0 
  0.5 

In [12]:
round(A * c, 14) == b


Out[12]:
true

In [13]:
round(c, 14) == d


Out[13]:
true