Demonstrate Gaussian Elimination (page 51 of GS)
(Reminder: Julia programming syntax will not be tested in this class, but that doesn't mean you can't learn from watching the code being executed)
(If you are familiar with Jupyter notebooks and wish to execute yourself, you can download this notebook using the download button in the upper right, but WARNING: right click to "download as", or OPTION-click (MAC) or ALT-Click (Linux and Windows I think) on the download icon, or you won't get an ipynb file.) You can then drag into Jupyter.
using Plots
# nice viz for matrices
function lookat(A; redrow=0, rounding=2, showtext=true)
n = size(A,1)
plot(legend=false, axis=false)
rowcolor = redrow > 0 ? :red : :black
for i=1:n, j=1:n
scatter!( [j],[i], ann= showtext ? (j,i,round(A[i,j],digits=rounding), :white ) : (j,i,"") ,
color=abs(A[i,j]) > .0001 ? (i==redrow ? rowcolor : :black) : :white,
marker=:square, markersize=30, aspectratio=1, yflip=true, yaxis=[.5,n+.5],xaxis=[.5,n+.5])
end
plot!()
end
lookat (generic function with 1 method)
A = rand(1.0:9,4,4)
4×4 Array{Float64,2}: 4.0 9.0 4.0 9.0 4.0 7.0 6.0 6.0 2.0 9.0 8.0 6.0 7.0 1.0 6.0 8.0
L = fill(0.0,4,4)
4×4 Array{Float64,2}: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
lookat(A)
L[2,1] = A[2,1] / A[1,1]
1.0
# A[2,:] = A[2,:] - L[2,1] * A[1,:]
A[2,:] -= L[2,1] * A[1,:] # subtract that multiple of the first row from the second
lookat(A, redrow=2)
L[3,1] = A[3,1] / A[1,1]
0.5
A[3,:] -= L[3,1] * A[1,:]
lookat(A, redrow=3)
L[4,1] = A[4,1] / A[1,1]
A[4,:] -= L[4,1] * A[1,:]
lookat(A, redrow=4)
L[3,2] = A[3,2] / A[2,2]
-2.25
A[3,:] -= L[3,2] * A[2,:]; lookat(A, redrow=3)
L[4,2] = A[4,2] / A[2,2]; A[4,:] -= L[4,2] * A[2,:]; lookat(A, redrow=4)
n = 5
A = randn(n,n)
L = fill(0.0,n,n)
display(lookat(A))
for j=1:n, i=(j+1):n
L[i,j] = A[i,j]/A[j,j]
A[i,:] -= L[i,j] * A[j,:]
display(lookat(A,redrow=i))
end
n = 5
A = randn(n,n)
L = fill(0.0,n,n)
Akeep = [copy(A)]
row = [0]
display(lookat(A))
for j=1:n, i=(j+1):n
L[i,j] = A[i,j]/A[j,j]
A[i,:] -= L[i,j] * A[j,:]
push!(Akeep,copy(A))
push!(row,i)
end
using Interact
Unable to load WebIO. Please make sure WebIO works for your Jupyter client. For troubleshooting, please see the WebIO/IJulia documentation.
@manipulate for i=slider(1:length(Akeep),value=1)
lookat(Akeep[i],redrow=row[i],showtext=true)
end
using LinearAlgebra
U = Akeep[end]
A = Akeep[1]
L += I
5×5 Array{Float64,2}: 1.0 0.0 0.0 0.0 0.0 11.2268 1.0 0.0 0.0 0.0 1.65127 0.100262 1.0 0.0 0.0 22.1736 2.04623 -7.9508 1.0 0.0 -7.45666 -0.817478 -7.32798 1.03327 1.0
L*U
5×5 Array{Float64,2}: 0.0737129 -0.934928 0.686715 0.756193 0.665156 0.827557 -0.250188 0.22969 -0.451796 -0.067432 0.12172 -0.516531 0.479388 -1.64916 0.735843 1.63448 0.234953 -0.837002 1.12689 -2.08616 -0.549652 -1.40446 0.295059 2.6386 -1.12414
A
5×5 Array{Float64,2}: 0.0737129 -0.934928 0.686715 0.756193 0.665156 0.827557 -0.250188 0.22969 -0.451796 -0.067432 0.12172 -0.516531 0.479388 -1.64916 0.735843 1.63448 0.234953 -0.837002 1.12689 -2.08616 -0.549652 -1.40446 0.295059 2.6386 -1.12414
L*U ≈ A
true