Files
thesis/julia/src/inner_loop/phase.jl
2021-10-05 20:14:39 -06:00

61 lines
1.8 KiB
Julia

using SNOW
export solve_phase
struct Result
converged::Bool
info::Symbol
sol::Matrix{Float64}
end
"""
This function will take a single phase (so an initial state, and a final state) and an initial guess
to the thrust profile and use an NLP solver to find the nearest thrust profile to that initial guess
that satisfies the final state condition
"""
function solve_phase( start::Vector{Float64},
final::Vector{Float64},
craft::Sc,
tof::Float64,
x0::Matrix{Float64},
primary::Body=Sun;
tol=1e-8,
verbose::Bool=false )
n = size(x0)[1]
function f!(g,x)
try
g[1:6] .= prop(reshape(x,(n,3)), start, craft, tof, primary)[2][1:6]
return 1.
catch e
if isa(e,LaGuerreConway_Error) || isa(e, Mass_Error) || isa(e, PropOne_Error)
return 10_000.
else
rethrow
end
end
end
lower_x = -1 * ones(3n)
upper_x = ones(3n)
num_constraints = 6
filename = "ipopt_"*string(rand(UInt))
ipopt_options = Dict("constr_viol_tol" => tol,
"acceptable_constr_viol_tol" => 1e-4,
"max_iter" => 10_000,
"max_cpu_time" => 30.,
"print_level" => 0,
"output_file" => filename)
options = Options(solver=IPOPT(ipopt_options),
derivatives=ForwardAD())
x, _, info = minimize(f!, vec(x0), num_constraints, lower_x, upper_x, final[1:6], final[1:6], options)
rm(filename)
if info in [:Solve_Succeeded, :Solved_To_Acceptable_Level]
return Result(true, info, reshape(x,(n,3)))
else
if verbose println(info) end
return Result(false, info, x0)
end
end