|
|
|
# External dependencies
|
|
|
|
using TypedPolynomials
|
|
|
|
|
|
|
|
# Local dependencies
|
|
|
|
include("start-system.jl")
|
|
|
|
include("homotopy.jl")
|
|
|
|
include("homogenize.jl")
|
|
|
|
include("euler-newton.jl")
|
|
|
|
include("adapt-step.jl")
|
|
|
|
include("plot.jl")
|
|
|
|
using .StartSystem
|
|
|
|
using .Homotopy
|
|
|
|
using .Homogenize
|
|
|
|
using .EulerNewton
|
|
|
|
using .AdaptStep
|
|
|
|
using .Plot
|
|
|
|
|
|
|
|
# Main homotopy continuation loop
|
|
|
|
function solve(F, (G, roots) = start_system(F), maxsteps=10000)
|
|
|
|
# F=homogenize(F)
|
|
|
|
H=homotopy(F,G)
|
|
|
|
solutions = []
|
|
|
|
|
|
|
|
Threads.@threads for r in roots
|
|
|
|
t = 1.0
|
|
|
|
step_size = 0.01
|
|
|
|
x0 = r
|
|
|
|
m = 0
|
|
|
|
steps = 0
|
|
|
|
|
|
|
|
while t > 0 && steps < maxsteps
|
|
|
|
x = en_step(H, x0, t, step_size)
|
|
|
|
(m, step_size) = adapt_step(x, x0, step_size, m)
|
|
|
|
x0 = x
|
|
|
|
t -= step_size
|
|
|
|
steps += 1
|
|
|
|
end
|
|
|
|
push!(solutions, x0)
|
|
|
|
end
|
|
|
|
|
|
|
|
return solutions
|
|
|
|
end
|
|
|
|
|
|
|
|
# Input polynomial system
|
|
|
|
@polyvar x y
|
|
|
|
F = [x*y - 1, x^2 + y^2 - 4]
|
|
|
|
T = [x*y - 1, x^2 + y^2 - 2]
|
|
|
|
C = [x^3 - y + 5x^2 - 10, 2x^2 - y - 10]
|
|
|
|
|
|
|
|
sF = filter(u -> imag(u[1]) < 0.1 && imag(u[2]) < 0.1, solve(F))
|
|
|
|
sT = filter(u -> imag(u[1]) < 0.1 && imag(u[2]) < 0.1, solve(T))
|
|
|
|
sC = filter(u -> imag(u[1]) < 0.1 && imag(u[2]) < 0.1, solve(C))
|
|
|
|
|
|
|
|
# Plotting the system and the real solutions
|
|
|
|
ENV["GKSwstype"]="nul"
|
|
|
|
plot_real(sF, F, 4, 4, "1")
|
|
|
|
plot_real(sT, T, 4, 4, "2")
|
|
|
|
plot_real(sC, C, 6, 12, "3")
|