Implemented Gram-Schmidt in all calculations
This commit is contained in:
parent
8cdf0201da
commit
fc960d66cf
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue