Skip to content

Repository files navigation

OptimalControl.jl

The OptimalControl.jl package is part of the control-toolbox ecosystem.

Category Badge
Documentation Stable Docs Dev Docs Ask DeepWiki
CI / Build Build Status
Test Coverage Coverage
Package Evaluation PkgEval Dependencies
Release / Version Release
Citation DOI
License License
Code Style / Quality Code Style: Blue Aqua.jl
Downloads Monthly Total

About control-toolbox

The control-toolbox ecosystem brings together Julia packages for mathematical control and its applications.

  • The root package, OptimalControl.jl, provides tools to model and solve optimal control problems defined by ordinary differential equations. It supports both direct and indirect methods, and can run on CPU or GPU.

Documentation OptimalControl.jl

  • Complementing it, OptimalControlProblems.jl offers a curated collection of benchmark optimal control problems formulated with ODEs in Julia. Each problem is available both in the OptimalControl DSL and in JuMP, with discretised versions ready to be solved using the solver of your choice. This makes the package particularly useful for benchmarking and comparing different solution strategies.

Documentation OptimalControlProblems.jl

Installation

To install OptimalControl please open Julia's interactive session (known as REPL) and press ] key in the REPL to use the package mode, then add the package:

julia> ]
pkg> add OptimalControl

Tip

If you are new to Julia, please follow this guidelines.

Note

The package requires Julia version 1.10 or later.

Motivation

The guiding philosophy of OptimalControl.jl is to offer, to our knowledge, the only Julia package that unifies both direct and indirect methods for optimal control within a single, coherent framework. This fills a gap in a landscape where existing tools are fragmented across programming languages and paradigms, and are usually restricted to a single family of methods. The package provides a domain-specific language that closely matches mathematical notation, together with multiple discretization schemes and shooting methods, and planned support for homotopy continuation methods. Its modeler–solver separation makes it agnostic to the underlying NLP modeling backend and optimization solver, and enables seamless execution on both CPU and GPU with minimal user intervention. Combined with an ecosystem of domain-specific applications, tutorials, and benchmarking tools, this design targets researchers and engineers working in optimal control, control theorists developing new algorithms, and students learning the field through interactive tutorials.

Basic usage

Let us model and solve a simple optimal control problem, then plot the solution:

using OptimalControl
using NLPModelsIpopt  # activates the Ipopt solver extension (required for solve)
using Plots           # activates the plotting extension (required for plot)

ocp = @def begin
    t  [0, 1], time
    x  R², state
    u  R, control
    x(0) == [-1, 0]
    x(1) == [0, 0]
    (t) == [x₂(t), u(t)]
    0.5( u(t)^2 )  min
end

sol = solve(ocp)

plot(sol)

For more details about this problem, please check the basic example presented in the documentation.

Testing

OptimalControl.jl is the umbrella package of a multi-repository ecosystem with a layered testing strategy: each sub-package has its own suite combining unit tests, integration tests, and code-quality checks, while the umbrella package adds strong end-to-end tests solving complete problems by both direct and indirect methods. Continuous integration runs on Linux, macOS, and Windows, on both CPU and GPU, through reusable workflows centralized in CTActions, with code coverage tracked on Codecov and downstream packages guarded against regressions through breakage tests. Part of the test code is written with AI assistance, always under human review.

Citing us

If you use OptimalControl.jl in your work, please cite us:

Caillau, J.-B., Cots, O., Gergaud, J., Martinon, P., & Sed, S. OptimalControl.jl: a Julia package to model and solve optimal control problems with ODE's [Computer software]. https://doi.org/10.5281/zenodo.13336563

or in BibTeX format:

@software{OptimalControl_jl,
author = {Caillau, Jean-Baptiste and Cots, Olivier and Gergaud, Joseph and Martinon, Pierre and Sed, Sophia},
doi = {10.5281/zenodo.13336563},
license = {["MIT"]},
title = {{OptimalControl.jl: a Julia package to model and solve optimal control problems with ODE's}},
url = {https://control-toolbox.org/OptimalControl.jl}
}

Contributing

If you think you found a bug or if you have a feature request / suggestion, feel free to open an issue.
Before opening a pull request, please start an issue or a discussion on the topic.

Contributions are welcomed, check out how to contribute to a Github project. If it is your first contribution, you can also check this first contribution tutorial. You can find first good issues (if any 🙂) here. You may find other packages to contribute to at the control-toolbox organization.

If you want to ask a question, feel free to start a discussion here. This forum is for general discussion about this repository and the control-toolbox organization.

Note

If you want to add an application or a package to the control-toolbox ecosystem, please follow this set up tutorial.