Homoclinic Orbit and Heteroclinic Orbit
Definition1
Let the space and the function be given. Consider the following vector field presented in the form of a differential equation. A flow of this system can be represented as .
Homoclinic Orbit
For a certain fixed point , a curve satisfying the following is called a homoclinic orbit.
Heteroclinic Orbit
For two different fixed points , a curve satisfying the following is called a heteroclinic orbit.
Explanation
As the names suggest, a homoclinic orbit converges to the same fixed point both forward and backward in time, hence the prefix homo. On the other hand, a heteroclinic orbit converges to different fixed points, hence the prefix hetero.
Although not directly mentioned in the definition, a homoclinic orbit must have both an entry and an exit path at , making it a saddle. Meanwhile, a heteroclinic orbit must be an unstable manifold from the exit side at and a stable manifold from the entry side at .
Visualization
Although it is easy to visualize a heteroclinic orbit flowing from one point to another, it is not intuitive to visualize a homoclinic orbit, which includes a closed curve and saddles.
For example, in the given system where and , let’s visualize only the homoclinic orbit that appears in the system23.
If you plot the flow from initial points inside the orbit in a video, it looks like this:
Code
The following Julia code generates the data used in this post.
using Plots, LinearAlgebra
μ = -1.755
h = 0.1
f(v) = [v[1] + v[2], μ*v[2] + v[1]^2 - v[1]*v[2]]
pos = Base.product(-1.5:h:.5, -.5:h:2)
dir = f.(pos) ./ 10norm.(f.(pos))
v_ = [[-0.5,0.5]]
for _ in 1:500000
push!(v_, v_[end] + 0.0001f(v_[end]))
end
truncated_v_ = v_[340000:460000]
p1 = quiver(first.(pos), last.(pos), quiver = (first.(dir), last.(dir)),
xlabel = "x", ylabel = "y", color = :gray, size = [600, 600])
p1 = plot(p1, first.(truncated_v_[1:60000]), last.(truncated_v_[1:60000]), color = :black, lw = 2, label = "orbit", arrow = true)
p1 = plot(p1, first.(truncated_v_[60001:80000]), last.(truncated_v_[60001:80000]), color = :black, lw = 2, label = :none, arrow = true)
p1 = plot(p1, first.(truncated_v_[80001:90000]), last.(truncated_v_[80001:90000]), color = :black, lw = 2, label = :none, arrow = true)
p1 = plot(p1, first.(truncated_v_[90001:120000]), last.(truncated_v_[90001:120000]), color = :black, lw = 2, label = :none, arrow = true)
p1 = scatter(p1, [0], [0], color = :black, label = "saddle node", shape = :rect)
png(p1, "saddle_orbit.png")
anim = @animate for tk in 1:1000:460001
plot(p1, first.(v_[1:100:tk]), last.(v_[1:100:tk]), lw = 1, color = :blue, label = :none, arrow = true)
end
mp4(anim, "saddle_orbit.mp4", fps = 30)
Related Topics
Kuznetsov. (1998). Elements of Applied Bifurcation Theory: p59. ↩︎
Wu. (2000). Homoclinic Bifurcation in an SIQR Model for Childhood Diseases: https://doi.org/10.1006/jdeq.2000.3882 ↩︎