Разложение Холецкого#
Стандартное разложение Холецкого доступно в стандартной библиотеке LinearAlgebra.cholesky
.
Ниже представлено модифицированное разложение Холецкого по (Gill, Murray & Wright, Practical optimization (1981), p.111).
Функция 3
(γξ)
"""
γξ(A::AbstractMatrix)
Наибольшие абсолютные значения на диагонали и вне диагонали симметричной матрицы `A`.
"""
function γξ(A::AbstractMatrix)
n = LinearAlgebra.checksquare(A)
γ = ξ = zero(eltype(A))
for j in 1:n
for i in 1:j-1
ξ = max(ξ, abs(A[i,j]))
end
γ = max(γ, abs(A[j,j]))
end
return γ, ξ
end
Функция 4
(mcholesky!)
Модифицированное разложение Холецкого
"""
mcholesky!(A::AbstractMatrix)
In-place модифицированное разложение Холецкого матрицы `A`.
Возвращает объект разложения типа `LinearAlgebra.Cholesky`.
Gill, Murray & Wright, Practical optimization (1981), p.111
"""
function mcholesky!(A::AbstractMatrix{T}; δ=convert(T, 1e-3)) where {T}
n = LinearAlgebra.checksquare(A)
γ, ξ = γξ(A)
ν = max(1, sqrt(n^2 - 1))
β² = max(γ, ξ / ν, eps(T))
θ = zero(T)
u = UpperTriangular(A)
c = u
@inbounds for j in 1:n
c_jj = A[j,j]
θ = zero(c_jj)
for k in 1:j-1
u[k,j] /= u[k,k]
end
for i in j+1:n
c_ij = c[j,i]
for k in 1:j-1
c_ij -= u[k,j] * c[k,i] / u[k,k]
end
θ = max(abs(c_ij), θ)
c[j,i] = c_ij
end
d_j = max(abs(c_jj), θ^2 / β², δ)
u[j,j] = sqrt(d_j)
for i in j+1:n
c[i,i] -= (c[j,i] / u[j,j])^2
end
end
return Cholesky(A, 'U', 0)
end