在 Julia 中求解复杂的对称稀疏线性系统

Solve Complex Symmetric Sparse Linear Systems in Julia

我正在构建一个数字代码,需要求解复杂的、结构对称的线性系统。

我要解决的系统示例如下:

A = [20.0          0        0          0
    0          0        0 -10.6458im
    0          0 8.333333          0
    0 -10.6458im        0          1]

b = [0.0, 6.473417506631299,  0.0, 0.0]

x = A\b

预期结果大约是:

x = [0, 0.0571185, 0, 0.6080724329436303im]

由于我需要使用稀疏系统,因此我通过仅存储下三角部分将矩阵 A 构建为稀疏矩阵(sparseCSC 格式)。然后我使它与调用对称:

A = Symmetric(A,:L)

typeof返回的类型是:

LinearAlgebra.Symmetric{ComplexF64, SparseArrays.SparseMatrixCSC{ComplexF64, Int64}}

在我需要解决涉及所述矩阵(使用 x = A\b)的线性系统之前,一切似乎都很好。出现以下错误:

LoadError: MethodError: no method matching lu!(::SparseArrays.SparseMatrixCSC{ComplexF64, Int64}, ::Val{true}; check=true)
Closest candidates are:
  lu!(::StridedMatrix{T}, ::Union{Val{true}, Val{false}}; check) where T<:Union{Float32, 
Float64, ComplexF32, ComplexF64} at 
C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\LinearAlgebra\src\lu.jl:79
  lu!(::Union{LinearAlgebra.Hermitian{T, S}, LinearAlgebra.Symmetric{T, S}} where {T, S}, ::Union{Val{true}, Val{false}}; check) at 
C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\LinearAlgebra\src\lu.jl:88
  lu!(::StridedMatrix{T} where T, ::Union{Val{true}, Val{false}}; check) at 
C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\LinearAlgebra\src\lu.jl:130 

有人遇到过这个问题吗?有没有更正确的方法来解决 Julia 中的复杂对称稀疏系统? (我在 Windows 10 上使用 Julia 1.6.1)。

这似乎是一个与这个几乎相同的错误:https://github.com/JuliaLang/SuiteSparse.jl/issues/18

我相信,截至今天,唯一的选择可能是在求解 A 时删除对称信息 b:

julia> sparse(A)\b
4-element Vector{ComplexF64}:
                 0.0 + 0.0im
 0.05711852871025479 + 0.0im
                 0.0 + 0.0im
                -0.0 + 0.6080724329436303im