Skip to content

Commit 7be5d92

Browse files
committed
Add linear hull for solving system of linear equations
1 parent 22470c5 commit 7be5d92

File tree

5 files changed

+47
-12
lines changed

5 files changed

+47
-12
lines changed

perf/linear_eq.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,14 @@ end
4343

4444
function benchmark_elimination(max=10)
4545
df = DataFrame()
46-
df[:Method] = ["Gauss Elimination", "Base.\\"]
46+
df[:Method] = ["Gauss Elimination", "Base.\\", "Linear Hull"]
4747
for n in 1:max
4848
A, mA, sA = randMat(n)
4949
b, mb, sb = randVec(n)
5050
t1 = @belapsed gauss_elimination_interval($A, $b)
5151
t2 = @belapsed gauss_elimination_interval1($A, $b)
52-
df[Symbol("$n")] = [t1, t2]
52+
t3 = @belapsed linear_hull($A, $b)
53+
df[Symbol("$n")] = [t1, t2, t3]
5354
end
5455
a = []
5556
for i in 1:max

perf/linear_eq_tabular.txt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,15 @@ Gauss Seidel
3939

4040
Gauss Elimination
4141

42-
5×3 DataFrames.DataFrame
43-
│ Row │ n │ Base.\\ │ Gauss Elimination │
44-
├─────┼───┼────────────┼───────────────────┤
45-
│ 1 │ 1 │ 1.84e-6 │ 8.127e-6 │
46-
│ 2 │ 2 │ 3.1615e-6 │ 1.0029e-5 │
47-
│ 3 │ 3 │ 4.53986e-6 │ 1.1211e-5 │
48-
│ 4 │ 4 │ 6.8655e-6 │ 1.4342e-5 │
49-
│ 5 │ 5 │ 1.0773e-5 │ 1.7725e-5 │
42+
│ Row │ n │ Base.\\ │ Gauss Elimination │ Linear Hull │
43+
├─────┼────┼────────────┼───────────────────┼─────────────┤
44+
│ 1 │ 1 │ 1.9415e-6 │ 8.40867e-6 │ 3.94457e-6 │
45+
│ 2 │ 10 │ 7.1184e-5 │ 7.8812e-5 │ 4.6999e-5 │
46+
│ 3 │ 2 │ 3.34387e-6 │ 1.012e-5 │ 5.30567e-6 │
47+
│ 4 │ 3 │ 4.548e-6 │ 1.0955e-5 │ 6.5832e-6 │
48+
│ 5 │ 4 │ 7.256e-6 │ 1.3845e-5 │ 1.1115e-5 │
49+
│ 6 │ 5 │ 1.0878e-5 │ 1.7847e-5 │ 1.4564e-5 │
50+
│ 7 │ 6 │ 1.5747e-5 │ 2.1526e-5 │ 1.9468e-5 │
51+
│ 8 │ 7 │ 2.296e-5 │ 3.109e-5 │ 2.7597e-5 │
52+
│ 9 │ 8 │ 3.4512e-5 │ 4.0778e-5 │ 3.7466e-5 │
53+
│ 10 │ 9 │ 4.8627e-5 │ 5.7028e-5 │ 5.3766e-5 │

src/IntervalRootFinding.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export
1919
Root, is_unique,
2020
roots, find_roots,
2121
bisect, newton1d, slope,
22-
slope_newton1d,
22+
slope_newton1d, linear_hull,
2323
gauss_seidel_interval, gauss_seidel_interval!,
2424
gauss_seidel_contractor, gauss_seidel_contractor!,
2525
gauss_elimination_interval, gauss_elimination_interval!

src/linear_eq.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,33 @@ function gauss_elimination_interval1!(x::AbstractArray, a::AbstractMatrix, b::Ab
143143

144144
a \ b
145145
end
146+
147+
function linear_hull(M::AbstractMatrix, r::AbstractArray)
148+
149+
n = size(M, 1)
150+
151+
((M, r) = preconditioner(M, r))
152+
M_lo = inf.(M)
153+
M_hi = sup.(M)
154+
# M = interval.((2*eye(n) - M_hi), M_hi) #is it necessary?
155+
if all(.≤(M_lo, zero(M_lo)))
156+
return M \ r
157+
end
158+
P = inv(M_lo)
159+
if all(.≤(eye(n), (P)))
160+
H1 = P * sup.(r)
161+
C = 1 ./ (2diag(P) - 1)
162+
Z = ((2mid.(r)) .* diag(P)) - H1
163+
H2 = C .* Z
164+
for i in 1:n
165+
if Z[i] < 0
166+
H2[i] = Z[i]
167+
end
168+
end
169+
H = interval.(min.(H1, H2), max.(H1, H2))
170+
171+
return H
172+
else
173+
return M \ r
174+
end
175+
end

test/linear_eq.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ using IntervalArithmetic, StaticArrays, IntervalRootFinding
99

1010
for i in 1:length(A)
1111
for precondition in (false, true)
12-
for f in (gauss_seidel_interval, gauss_seidel_contractor, gauss_elimination_interval)
12+
for f in (gauss_seidel_interval, gauss_seidel_contractor, gauss_elimination_interval, linear_hull)
1313
@test all(x[i] .⊆ f(A[i], b[i]))
1414
end
1515
end

0 commit comments

Comments
 (0)