Commit 8bc25e06 authored by Javier's avatar Javier

comp_t0 polynomial fit

comp_t0 is generalized for polynomials of degree npol
parent 8858663f
...@@ -100,15 +100,22 @@ dec_const_pcvc(corr::Corr, plat::Vector{Int64}, m::uwreal; pl::Bool=true, data:: ...@@ -100,15 +100,22 @@ dec_const_pcvc(corr::Corr, plat::Vector{Int64}, m::uwreal; pl::Bool=true, data::
dec_const_pcvc(corr.obs, plat, m, corr.mu, corr.y0, pl=pl, data=data) dec_const_pcvc(corr.obs, plat, m, corr.mu, corr.y0, pl=pl, data=data)
#t0 #t0
function get_model(x, p, n)
sum = 0.0
for k = 1:n
sum = sum .+ p[k] .* x.^(k-1)
end
return sum
end
@doc raw""" @doc raw"""
comp_t0(Y::YData, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Union{Matrix{Float64}, Nothing}=nothing) comp_t0(Y::YData, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Union{Matrix{Float64}, Nothing}=nothing, npol::Int64=2)
comp_t0(Y::Vector{YData}, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Union{Vector{Matrix{Float64}}, Nothing}=nothing) comp_t0(Y::Vector{YData}, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Union{Vector{Matrix{Float64}}, Nothing}=nothing, npol::Int64=2)
Computes t0 using the energy density of the action Ysl(Yang-Mills action). Computes t0 using the energy density of the action Ysl(Yang-Mills action).
t0 is computed in the plateau plat. t0 is computed in the plateau plat.
A (linear) interpolation in t is performed to find t0. A polynomial interpolation in t is performed to find t0, where npol is the degree of the polynomial (linear fit by default)
The flag pl allows to show the plot. The flag pl allows to show the plot.
...@@ -131,7 +138,7 @@ t0_r = comp_t0(Y, [38, 58], L=32, rw=[rw1, rw2], pl=true) ...@@ -131,7 +138,7 @@ t0_r = comp_t0(Y, [38, 58], L=32, rw=[rw1, rw2], pl=true)
``` ```
""" """
function comp_t0(Y::YData, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Union{Matrix{Float64}, Nothing}=nothing) function comp_t0(Y::YData, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Union{Matrix{Float64}, Nothing}=nothing, npol::Int64=2)
Ysl = Y.Ysl Ysl = Y.Ysl
t = Y.t t = Y.t
id = Y.id id = Y.id
...@@ -140,19 +147,21 @@ function comp_t0(Y::YData, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Un ...@@ -140,19 +147,21 @@ function comp_t0(Y::YData, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Un
xmax = size(Ysl, 2) xmax = size(Ysl, 2)
nt0 = t0_guess(t, Ysl, plat, L) nt0 = t0_guess(t, Ysl, plat, L)
Y_aux = Matrix{uwreal}(undef, xmax, 5) dt0 = iseven(npol) ? Int64(npol / 2) : Int64((npol+1)/ 2)
Y_aux = Matrix{uwreal}(undef, xmax, 2*dt0+1)
for i = 1:xmax for i = 1:xmax
k = 1 k = 1
for j = nt0-2:nt0+2 for j = nt0-dt0:nt0+dt0
Y_aux[i, k] = uwreal(Ysl[:, i, j], id) Y_aux[i, k] = uwreal(Ysl[:, i, j], id)
k = k + 1 k = k + 1
end end
end end
x = t[nt0-2:nt0+2] x = t[nt0-dt0:nt0+dt0]
t2E = [plat_av(Y_aux[:, j], plat) for j=1:5] .* x.^2 / L^3 t2E = [plat_av(Y_aux[:, j], plat) for j=1:2*dt0+1] .* x.^2 / L^3
@. model(x, p) = p[1]*x^3 + p[2]*x^2 + p[3]*x + p[4] model(x, p) = get_model(x, p, npol)
par = fit_routine(model, x, t2E, 4)
par = fit_routine(model, x, t2E, npol)
fmin(x, p) = model(x, p) .- 0.3 fmin(x, p) = model(x, p) .- 0.3
t0 = root_error(fmin, t[nt0], par) t0 = root_error(fmin, t[nt0], par)
if pl if pl
...@@ -170,8 +179,9 @@ function comp_t0(Y::YData, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Un ...@@ -170,8 +179,9 @@ function comp_t0(Y::YData, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Un
display(gcf()) display(gcf())
figure() figure()
plot(collect(1:xmax), value.(Y_aux[:, 3]) * t[nt0]^2 / L^3, "x") t_pl = dt0 + 1
fill_between(collect(plat[1]:plat[2]), v[3]+e[3], v[3]-e[3], alpha=0.75, color="green") plot(collect(1:xmax), value.(Y_aux[:, t_pl]) * t[nt0]^2 / L^3, "x")
fill_between(collect(plat[1]:plat[2]), v[t_pl]+e[t_pl], v[t_pl]-e[t_pl], alpha=0.75, color="green")
ylabel(L"$t^2E(x0, t)$") ylabel(L"$t^2E(x0, t)$")
xlabel(L"$x_0/a$") xlabel(L"$x_0/a$")
title(string(L"$t/a^2 = $", t[nt0])) title(string(L"$t/a^2 = $", t[nt0]))
...@@ -180,7 +190,7 @@ function comp_t0(Y::YData, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Un ...@@ -180,7 +190,7 @@ function comp_t0(Y::YData, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Un
return t0 return t0
end end
function comp_t0(Y::Vector{YData}, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Union{Vector{Matrix{Float64}}, Nothing}=nothing) function comp_t0(Y::Vector{YData}, plat::Vector{Int64}; L::Int64, pl::Bool=false, rw::Union{Vector{Matrix{Float64}}, Nothing}=nothing, npol::Int64=2)
nr = length(Y) nr = length(Y)
Ysl = getfield.(Y, :Ysl) Ysl = getfield.(Y, :Ysl)
t = getfield.(Y, :t) t = getfield.(Y, :t)
...@@ -200,19 +210,21 @@ function comp_t0(Y::Vector{YData}, plat::Vector{Int64}; L::Int64, pl::Bool=false ...@@ -200,19 +210,21 @@ function comp_t0(Y::Vector{YData}, plat::Vector{Int64}; L::Int64, pl::Bool=false
nt0 = t0_guess(t, tmp, plat, L) nt0 = t0_guess(t, tmp, plat, L)
xmax = size(tmp, 2) xmax = size(tmp, 2)
Y_aux = Matrix{uwreal}(undef, xmax, 5) dt0 = iseven(npol) ? Int64(npol / 2) : Int64((npol+1) / 2)
Y_aux = Matrix{uwreal}(undef, xmax, 2*dt0+1)
for i = 1:xmax for i = 1:xmax
k = 1 k = 1
for j = nt0-2:nt0+2 for j = nt0-dt0:nt0+dt0
Y_aux[i, k] = uwreal(tmp[:, i, j], id[1], replica) Y_aux[i, k] = uwreal(tmp[:, i, j], id[1], replica)
k = k + 1 k = k + 1
end end
end end
x = t[nt0-2:nt0+2] x = t[nt0-dt0:nt0+dt0]
t2E = [plat_av(Y_aux[:, j], plat) for j=1:5] .* x.^2 / L^3 t2E = [plat_av(Y_aux[:, j], plat) for j=1:2*dt0+1] .* x.^2 / L^3
model(x, p) = get_model(x, p, npol)
@. model(x, p) = p[1]*x^3 + p[2]*x^2 + p[3]*x + p[4] par = fit_routine(model, x, t2E, npol)
par = fit_routine(model, x, t2E, 4)
fmin(x, p) = model(x, p) .- 0.3 fmin(x, p) = model(x, p) .- 0.3
t0 = root_error(fmin, t[nt0], par) t0 = root_error(fmin, t[nt0], par)
if pl if pl
...@@ -230,8 +242,9 @@ function comp_t0(Y::Vector{YData}, plat::Vector{Int64}; L::Int64, pl::Bool=false ...@@ -230,8 +242,9 @@ function comp_t0(Y::Vector{YData}, plat::Vector{Int64}; L::Int64, pl::Bool=false
display(gcf()) display(gcf())
figure() figure()
plot(collect(1:xmax), value.(Y_aux[:, 3]) * t[nt0]^2 / L^3, "x") t_pl = dt0 + 1
fill_between(collect(plat[1]:plat[2]), v[3]+e[3], v[3]-e[3], alpha=0.75, color="green") plot(collect(1:xmax), value.(Y_aux[:, t_pl]) * t[nt0]^2 / L^3, "x")
fill_between(collect(plat[1]:plat[2]), v[t_pl]+e[t_pl], v[t_pl]-e[t_pl], alpha=0.75, color="green")
ylabel(L"$t^2E(x0, t)$") ylabel(L"$t^2E(x0, t)$")
xlabel(L"$x_0/a$") xlabel(L"$x_0/a$")
title(string(L"$t/a^2 = $", t[nt0])) title(string(L"$t/a^2 = $", t[nt0]))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment