|
| 1 | +using StaticArrays, Base.Test |
| 2 | + |
1 | 3 | """
|
2 | 4 | Create an almost singular `Matrix{Float64}` of size `N×N`.
|
3 | 5 |
|
|
69 | 71 | end
|
70 | 72 |
|
71 | 73 |
|
72 |
| -# Fuzz testing for inv() |
| 74 | +#------------------------------------------------------------------------------- |
| 75 | +# More comprehensive but qualitiative testing for inv() accuracy |
73 | 76 | #=
|
74 |
| -for i=1:100 |
75 |
| - N = 4 |
76 |
| - A = almost_singular_matrix(N, 3, 1e-7) |
77 |
| - SA = SMatrix{N,N}(A) |
78 |
| - SA_residual = norm(Matrix(SA*inv(SA) - eye(N))) |
79 |
| - A_residual = norm(A*inv(A) - eye(N)) |
80 |
| - if SA_residual/A_residual > 10000 |
81 |
| - @printf("%10e %.4f\n", SA_residual, SA_residual/A_residual) |
82 |
| - println("[") |
83 |
| - for i=1:4 |
84 |
| - for j=1:4 |
85 |
| - @printf("%.17e ", A[i,j]) |
86 |
| - end |
87 |
| - println() |
88 |
| - end |
89 |
| - println("]") |
| 77 | +using PyPlot |
| 78 | +
|
| 79 | +inv_residual(A::AbstractMatrix) = norm(A*inv(A) - eye(size(A,1))) |
| 80 | +
|
| 81 | +""" |
| 82 | + plot_residuals(N, rank, ϵ) |
| 83 | +
|
| 84 | +Plot `inv_residual(::StaticMatrix)` vs `inv_residual(::Matrix)` |
| 85 | +
|
| 86 | +""" |
| 87 | +function plot_residuals(N, rank, ϵ) |
| 88 | + A_residuals = [] |
| 89 | + SA_residuals = [] |
| 90 | + for i=1:10000 |
| 91 | + A = almost_singular_matrix(N, rank, ϵ) |
| 92 | + SA = SMatrix{N,N}(A) |
| 93 | + SA_residual = norm(Matrix(SA*inv(SA) - eye(N))) |
| 94 | + A_residual = norm(A*inv(A) - eye(N)) |
| 95 | + push!(SA_residuals, SA_residual) |
| 96 | + push!(A_residuals, A_residual) |
| 97 | + #= if SA_residual/A_residual > 10000 =# |
| 98 | + #= @printf("%10e %.4f\n", SA_residual, SA_residual/A_residual) =# |
| 99 | + #= println("[") =# |
| 100 | + #= for i=1:4 =# |
| 101 | + #= for j=1:4 =# |
| 102 | + #= @printf("%.17e ", A[i,j]) =# |
| 103 | + #= end =# |
| 104 | + #= println() =# |
| 105 | + #= end =# |
| 106 | + #= println("]") =# |
| 107 | + #= end =# |
90 | 108 | end
|
| 109 | + loglog(SA_residuals, A_residuals, ".", markersize=1.5) |
| 110 | +end |
| 111 | +
|
| 112 | +# Plot the accuracy of inv implementations for almost singular matrices of |
| 113 | +# various rank |
| 114 | +clf() |
| 115 | +N = 4 |
| 116 | +labels = [] |
| 117 | +for i in N:-1:1 |
| 118 | + plot_residuals(N, i, 1e-7) |
| 119 | + push!(labels, "rank $i") |
91 | 120 | end
|
| 121 | +xlabel("residual norm - inv(::StaticArray)") |
| 122 | +ylabel("residual norm - inv(::Array)") |
| 123 | +legend(labels) |
92 | 124 | =#
|
0 commit comments