The implementation has the following features:
Choice of transcription method: global pseudospectral collocation (Legendre, Chebyshev, Radau or Gauss), local discretisation (trapezoidal or Hermite–Simpson), or integrated-residual transcription.
Large-scale nonlinear programming using IPOPT, with an optional interface to SNOPT.
Automatic first and second derivatives using the CppAD automatic differentiation library.
Optional numerical differentiation using sparse finite differences, for both the Jacobian and the Hessian.
Automatic identification of the sparsity of the derivative matrices.
Estimation of the discretisation error.
Automatic mesh refinement: Betts’ mesh refinement method for local discretisations, and hp-adaptive mesh refinement for pseudospectral discretisations (Radau, Gauss, Legendre and Chebyshev), which adjusts both the number of mesh intervals and the polynomial degree within each interval to meet a specified accuracy.
Integrated-residual transcription, useful for problems with singular arcs or non-smooth solutions.
Estimation of the costate (adjoint) variables, which allows solutions to be checked against the necessary conditions of optimality.
Automatic scaling.
DAE formulation, so that differential and algebraic constraints can be implemented in the same C++ function.
A Python interface, enabling users to create and solve models without writing any C++, while benefiting from the speed of PSOPT’s C++ computational engine.
Easy to use interface to GNUplot to produce graphical output, including 2D plots, 3D curves and surfaces, and polar plots.
Automatic generation of LaTeX code to produce a table that summarises the mesh refinement process.
Continuous integration testing on GitHub Actions: every change to the code triggers a full build and a test run of selected examples, with results compared against reference values.