在 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
我正在构建一个数字代码,需要求解复杂的、结构对称的线性系统。
我要解决的系统示例如下:
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