From 99be9bdb78a32c0e45430cf0e5c8ca05dd33111e Mon Sep 17 00:00:00 2001 From: Nuwan Yapa Date: Thu, 4 Jun 2026 21:30:38 -0400 Subject: [PATCH] EC+ACCC implemented (works well, but not amazing) --- calculations/EC+ACCC.jl | 74 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 calculations/EC+ACCC.jl diff --git a/calculations/EC+ACCC.jl b/calculations/EC+ACCC.jl new file mode 100644 index 0000000..34e43e1 --- /dev/null +++ b/calculations/EC+ACCC.jl @@ -0,0 +1,74 @@ +using Roots, LinearAlgebra, Plots + +include("../ho_basis.jl") +include("../EC.jl") +include("../common.jl") + +V_of_r(r) = 2 * exp(-(r-3)^2 / (1.5)^2) +Λ = 0 +m = 1.0 + +ϕ = 0.0 +μω_global = 0.5 * exp(-2im * ϕ) +E_max = 40 + +H0 = get_3b_H_matrix(jacobi, V_of_r, μω_global, E_max, Λ, m, true, true) + +# Vp = perturbation to make the state artificially bound +Vp_of_r(r) = -exp(-(r/3)^2) +@time "Vp" Vp = get_3b_H_matrix(jacobi, Vp_of_r, μω_global, E_max, Λ, m, false, true) + +ref_E = -2.22 +training_c = [3.0, 2.6, 2.2, 1.8] + +EC = affine_EC(H0, Vp) +train!(EC, training_c; ref_eval=ref_E, CAEC=false) +training_E = EC.training_E + +quick_extrapolate(c) = argmin(real, get_extrapolated_evals(EC.H0_EC, EC.H1_EC, EC.N_EC, c, 0)) + +n_EC = 10 +EC_c = (1.8 .+ rand(n_EC)) .+ 0.001im .* (-2 .+ 4 * rand(n_EC)) + +target_c = 0.0 : 0.2 : 1.2 +exact_E = [4.076662025307587-0.012709842443350328im, + 3.613318119833891-0.007335804709990623im, + 3.1453431847006783-0.004030580410326795im, + 2.672967129943755-0.00211498327461944im, + 2.196542557810288-0.0010719835443437104im, + 1.7164583929199813-0.0005455212208182736im, + 1.233088227541505-0.0003070320106485624im] + +EC_E = [quick_extrapolate(c) for c in EC_c] + +# determining c0 with EC +c0 = find_zero(c -> abs2(quick_extrapolate(c)), 0.85) +println("Estimated c0 = ", c0) + +EC_k = alt_sqrt.(EC_E) + +order::Int = ceil((length(EC_c) - 1) / 2) # order of the Pade approximant + +# Solve coefficients as a linear system +M_left_element(c, i) = alt_sqrt(c - c0)^i +M_left = M_left_element.(EC_c, (0:order)') +M_right = -EC_k .* M_left[:, 2:end] # remove the first column +M = hcat(M_left, M_right) # M = [M_left | M_right] +sol = M \ EC_k +a = sol[1:order+1] +b = [1; sol[order+2:end]] + +# Pade approximant +polynomial(a, c) = sum(i -> a[i+1] * alt_sqrt(c - c0)^i, 0:order) +pade_approx(c) = polynomial(a, c) / polynomial(b, c) + +# Extrapolate +extrapolated_k = pade_approx.([EC_c; target_c]) +extrapolated_E = (extrapolated_k .^ 2) + +# Plotting +scatter(real.(training_E), imag.(training_E), label="training") +scatter!(real.(exact_E), imag.(exact_E), label="exact") +scatter!(real.(EC_E), imag.(EC_E), label="EC", m=:star5) +scatter!(real.(extrapolated_E), imag.(extrapolated_E), label="ACCC", m=:x) +savefig("temp/EC+ACCC.pdf")