Implemented Gram-Schmidt in all calculations

This commit is contained in:
Nuwan Yapa 2025-01-08 15:04:49 -05:00
parent 8cdf0201da
commit fc960d66cf
6 changed files with 17 additions and 11 deletions

View File

@ -33,7 +33,7 @@ for (j, c) in enumerate(training_points)
end
EC_basis = hcat(EC_basis, conj.(EC_basis)) # CA-EC
N_EC = transpose(EC_basis) * EC_basis
EC_basis = gram_schmidt!(EC_basis)
extrapolate_points = range(0.78, 0.45, 7) # original: range(0.75, 0.40, 8)
@ -47,7 +47,7 @@ for (j, c) in enumerate(extrapolate_points)
H = get_H_matrix(V_system(c), p, w)
H_berg = transpose(berg_basis_w) * H * berg_basis
H_EC = transpose(EC_basis) * H_berg * EC_basis
evals = eigvals(H_EC, N_EC)
evals = eigvals(H_EC)
i = argmin(abs.(evals .- exact_E[j]))
extrapolate_E[j] = evals[i]
end

View File

@ -1,4 +1,5 @@
using Plots
include("../helper.jl")
include("../p_space.jl")
berggren_mesh = get_mesh([0, 0.4 - 0.15im, 0.8, 6], [128, 128, 128])
@ -23,8 +24,8 @@ for mesh in (berggren_mesh, csm_mesh)
end
EC_basis = hcat(EC_basis, conj.(EC_basis)) # CA-EC
EC_basis = gram_schmidt!(EC_basis, w)
EC_basis_w = EC_basis .* w
N_EC = transpose(EC_basis_w) * EC_basis
extrapolate_points = range(0.78, 0.45, 7) # original: range(0.75, 0.40, 8)
@ -36,7 +37,7 @@ for mesh in (berggren_mesh, csm_mesh)
H = get_H_matrix(V_system(c), p, w)
H_EC = transpose(EC_basis_w) * H * EC_basis
evals = eigvals(H_EC, N_EC)
evals = eigvals(H_EC)
i = argmin(abs.(evals .- exact_E[j]))
extrapolate_E[j] = evals[i]
end

View File

@ -1,4 +1,5 @@
using Plots
include("../helper.jl")
include("../p_space.jl")
# contour
@ -27,15 +28,15 @@ ref_E = 0.2 - 0.1im
exact_E = Vector{ComplexF64}(undef, length(extrapolate_points))
extrapolate_E = Vector{ComplexF64}(undef, length(extrapolate_points))
EC_basis = gram_schmidt!(EC_basis, w)
EC_basis_w = EC_basis .* w
N_EC = transpose(EC_basis_w) * EC_basis
for (j, c) in enumerate(extrapolate_points)
exact_E[j] = quick_pole_E(V_system(c))
H = get_H_matrix(V_system(c), p, w)
H_EC = transpose(EC_basis_w) * H * EC_basis
evals = eigvals(H_EC, N_EC)
evals = eigvals(H_EC)
i = argmin(abs.(evals .- ref_E))
global ref_E = evals[i]
extrapolate_E[j] = evals[i]

View File

@ -33,7 +33,7 @@ for (j, c) in enumerate(training_points)
EC_basis[:, j] = evecs[:, i]
end
N_EC = transpose(EC_basis) * EC_basis
EC_basis = gram_schmidt!(EC_basis)
extrapolate_points = range(0.62, 0.40, 6) # original: range(0.75, 0.40, 8)
@ -47,7 +47,7 @@ for (j, c) in enumerate(extrapolate_points)
H = get_H_matrix(V_system(c), p, w)
H_berg = transpose(berg_basis_w) * H * berg_basis
H_EC = transpose(EC_basis) * H_berg * EC_basis
evals = eigvals(H_EC, N_EC)
evals = eigvals(H_EC)
i = argmin(abs.(evals .- exact_E[j]))
extrapolate_E[j] = evals[i]
end

View File

@ -1,4 +1,5 @@
using LinearAlgebra, Plots
include("../helper.jl")
include("../ho_basis.jl")
include("../p_space.jl")
@ -36,14 +37,14 @@ for (j, c) in enumerate(train_cs)
EC_basis[:, j] = evecs[:, i]
end
N_EC = transpose(EC_basis) * EC_basis
EC_basis = gram_schmidt!(EC_basis)
for (j, c) in enumerate(target_cs)
exact_E[j] = quick_pole_E((p, q) -> c*(V1*g0(R1, p, q) + V2*g0(R2, p, q)), μ; cs_angle=0.5)
H = T + c .* V
H_EC = transpose(EC_basis) * H * EC_basis
evals = eigvals(H_EC, N_EC)
evals = eigvals(H_EC)
i = argmin(abs.(evals .- exact_E[j]))
extrapolate_E[j] = evals[i]
end

View File

@ -51,7 +51,7 @@ end
"In-place c-orthogonalization via (modified) Gram-Schmidt. Only significant vectors are returned (c-normalized).
The number of significant vectors to return are determined by the original singular values (compared to the threshold)."
function gram_schmidt!(vecs, ws=ones(length(vecs[1])), threshold=1e-5; verbose=false)
function gram_schmidt!(vecs::Vector{Vector{T}}, ws=ones(length(vecs[1])), threshold=1e-5; verbose=false) where T<: Number
c_product(i, j) = sum(vecs[i] .* ws .* vecs[j])
norm(i) = c_product(i, i)
proj(i, j) = (c_product(i, j) / norm(i)) .* vecs[i] # component of vec[i] in vec[j]
@ -86,6 +86,9 @@ function gram_schmidt!(vecs, ws=ones(length(vecs[1])), threshold=1e-5; verbose=f
return vecs[selected_vecs_i]
end
"Same as above but the basis is provided as a matrix instead of an array of vectors"
gram_schmidt!(vecs::Matrix{T}, ws=ones(size(vecs, 1)), threshold=1e-5; verbose=false) where T<: Number = hcat(gram_schmidt!([vecs[:, i] for i in axes(vecs, 2)], ws, threshold; verbose=verbose)...)
"Rank of a basis set (pre-normalized) under c-product"
c_rank(vecs, ws, threshold=1e-8) = count(c_singular_values(vecs, ws) .> threshold)