diff --git a/tp/utils.jl b/tp/utils.jl new file mode 100644 index 0000000000000000000000000000000000000000..738282b7ea10bebd97bb275c17478fb47eb7e8a3 --- /dev/null +++ b/tp/utils.jl @@ -0,0 +1,141 @@ +# --------------------------------------------------------------------- +function plot_traj!(plt, F, z0, tf) + """ + Plot the trajectories in the phase plan of the ode ż(t)=F(z(t)), + for the initial points given in the z0, until the time tf. + ------- + + parameters (input) + ------------------ + plt : plot object + F : function F(z) + z0 : vector of vector of initial points + z0[i] = ith initial point + tf : final time + returns + ------- + nothing + """ + tspan = (0 , tf) + for i ∈ eachindex(z0) + prob = ODEProblem((z, _, _) -> F(z), z0[i], tspan) # défini le problème en Julia + sol = solve(prob) + plot!(plt, sol, vars = (1,2), legend = false, color = :blue) + end + return nothing +end + +# --------------------------------------------------------------------- +function plot_flow!(plt, F, z0, tf; nb_fronts=4) + """ + For times t ∈ range(0, tf, nb_fronts), plot the solution at time t of the Cauchy + problems ż(s) = F(z(s)), z(0) = z0[i]. + ------- + + parameters (input) + ------------------ + plt : plot object + F : function F(z) + z0 : vector of vector of initial points + z0[i] = ith initial point + tf : final time + returns + ------- + nothing + """ + tspan = (0, tf) + m = nb_fronts + T = range(0, tf, length=m) + print("Times = ", [round(t, digits=2) for t ∈ T], "\n") + N = length(z0) + V = [ [] for i ∈ 1:m ] + for i ∈ 1:N + prob = ODEProblem((z, _, _) -> F(z), z0[i], tspan) # défini le problème en Julia + sol = solve(prob) + for i ∈ 1:m + t = T[i] + push!(V[i], sol(t)) + end + end + for i ∈ 1:m + plot!(plt, [V[i][j][1] for j ∈ 1:N], [V[i][j][2] for j ∈ 1:N], legend = false, + color = :green, linewidth = 2) + end + return nothing +end + +# ------------------------------------------------------------------------------- +# Fonction qui construit le flot à partir d'un système hamiltonien +# dans le but de résoudre un système hamiltonien +# +# (dx/dt, dp/dt) = Hv(x, p), (x(t0), p(t0)) = (x0, p0) +# +# où Hv = (dH/dp, -dH/dx). +# +function Flow(Hv) + """ + + parameters (input): Hv + + function Hv(x, p) + dx = dH/dp + dp = -dH/dx + return dx, dp + end + + returns (output): f + + usage: + + julia> f = Flow(Hv) + julia> xf, pf = f(t0, x0, p0, tf) + + to get the endpoints. Or + + julia> sol = f((t0, tf), x0, p0) + + to get the solution object, to plot the trajectory for example. + + julia> plot(sol, vars=(1,2) + + """ + # + function rhs!(dz, z, dummy, t) + n = size(z, 1)÷2 + dz[1:n], dz[n+1:2n] = Hv(z[1:n], z[n+1:2n]) + end + + # cas vectoriel + function f(tspan::Tuple{Real, Real}, x0::Vector{<:Real}, p0::Vector{<:Real}; abstol=1e-12, reltol=1e-12, saveat=0.01) + z0 = [ x0 ; p0 ] + ode = ODEProblem(rhs!, z0, tspan) + sol = solve(ode, Tsit5(), abstol=abstol, reltol=reltol, saveat=saveat) + return sol + end + + function f(t0::Real, x0::Vector{<:Real}, p0::Vector{<:Real}, tf::Real; abstol=1e-12, reltol=1e-12, saveat=[]) + sol = f((t0, tf), x0, p0, abstol=abstol, reltol=reltol, saveat=saveat) + n = size(x0, 1) + return sol(tf)[1:n], sol(tf)[n+1:2n] + end + + # cas scalaire + function rhs_scalar!(dz, z, dummy, t) + dz[1], dz[2] = Hv(z[1], z[2]) + end + + function f(tspan::Tuple{Real, Real}, x0::Real, p0::Real; abstol=1e-12, reltol=1e-12, saveat=0.01) + z0 = [ x0 ; p0 ] + ode = ODEProblem(rhs_scalar!, z0, tspan) + sol = solve(ode, Tsit5(), abstol=abstol, reltol=reltol, saveat=saveat) + return sol + end + + function f(t0::Real, x0::Real, p0::Real, tf::Real; abstol=1e-12, reltol=1e-12, saveat=[]) + sol = f((t0, tf), x0, p0, abstol=abstol, reltol=reltol, saveat=saveat) + return sol(tf)[1], sol(tf)[2] + end + + return f + +end; \ No newline at end of file