@@ -16,7 +16,7 @@ function sym_lu(A)
16
16
for i= 1 : min (m, n)
17
17
L[i,i] = 1
18
18
end
19
- U = copy ( A)
19
+ U = copy! ( Array {Any} (undef, size (A)), A)
20
20
p = BlasInt[1 : m;]
21
21
for k = 1 : m- 1
22
22
_, i = findmin (map (ii-> iszero (U[ii, k]) ? Inf : nterms (U[ii,k]), k: n))
@@ -31,14 +31,13 @@ function sym_lu(A)
31
31
U[j,k: m] .= U[j,k: m] .- L[j,k] .* U[k,k: m]
32
32
end
33
33
end
34
- factors = copy (U)
35
34
for j= 1 : m
36
35
for i= j+ 1 : n
37
- factors [i,j] = L[i,j]
36
+ U [i,j] = 0
38
37
end
39
38
end
40
39
41
- LU (factors, p, BlasInt ( 0 ))
40
+ (L, U, LinearAlgebra . ipiv2perm (p, m ))
42
41
end
43
42
44
43
# Given a vector of equations and a
@@ -67,11 +66,19 @@ Currently only works if all equations are linear.
67
66
"""
68
67
function solve (eqs, vars)
69
68
A, b = A_b (eqs, vars)
69
+ _solve (A, b)
70
+ end
71
+
72
+ function _solve (A, b)
70
73
A = SymbolicUtils. simplify .(to_symbolic .(A), polynorm= true )
71
74
b = SymbolicUtils. simplify .(to_symbolic .(b), polynorm= true )
72
75
map (to_mtk, SymbolicUtils. simplify .(ldiv (sym_lu (A), b)))
73
76
end
74
77
78
+ LinearAlgebra.:(\ )(A:: AbstractMatrix{<:Expression} , b:: AbstractVector{<:Expression} ) = _solve (A, b)
79
+ LinearAlgebra.:(\ )(A:: AbstractMatrix{<:Expression} , b:: AbstractVector ) = _solve (A, b)
80
+ LinearAlgebra.:(\ )(A:: AbstractMatrix , b:: AbstractVector{<:Expression} ) = _solve (A, b)
81
+
75
82
# ldiv below
76
83
77
84
_iszero (x:: Number ) = iszero (x)
@@ -90,13 +97,10 @@ function simplifying_dot(x,y)
90
97
end
91
98
end
92
99
93
- function ldiv (A:: LU , b)
94
- L = A. L
95
- U = A. U
96
-
100
+ function ldiv ((L,U,p), b)
97
101
m, n = size (L)
98
102
x = Vector {Any} (undef, length (b))
99
- b = b[A . p]
103
+ b = b[p]
100
104
101
105
for i= n: - 1 : 1
102
106
sub = simplifying_dot (x[i+ 1 : end ], U[i,i+ 1 : end ])
0 commit comments