L’écosystème Julia control-toolbox pour le contrôle optimal

Olivier Cots – Toulouse INP, IRIT, Inria

Jean-Baptiste Caillau • Joseph Gergaud • Pierre Martinon • SED Sophia

Café Julia, 20 novembre 2025 (https://github.com/ocots/cafe-julia)

Contexte

Le projet control-toolbox est une organisation GitHub qui rassemble plusieurs packages Julia pour modéliser, résoudre et analyser des problèmes de contrôle optimal dans les équations différentielles ordinaires déterministes. Son package principal est OptimalControl.jl, dont la première version a été publiée le 4 février 2023.

Dans cette présentation, nous verrons :

  • Une introduction au contrôle optimal ;
  • Une présentation de l'architecture du projet ;
  • Un panorama de l'écosystème Julia pour le contrôle optimal ;
  • Une démonstration pratique sur un exemple simple et une application plus complexe ;
  • Une étude comparative de performances sur CPU et GPU ;
  • Une présentation des principaux choix de conception logicielle.

1. Introduction

  • Un problème de contrôle optimal consiste à déterminer, pour un système dynamique contrôlé, une trajectoire optimale et la commande associée. La paire trajectoire-commande peut être soumise à des contraintes. Une paire est dite optimale si elle minimise un critère donné, parmi toutes celles admissibles.

Transfert Terre–Lune – Mission Apollo XI

  • Domaine : optimisation dans les équations différentielles ordinaires déterministes.
  • Applications : aéronautique, aérospatial, biologie, énergie, finance, robotique, santé...

2. Panorama de control-toolbox

Packages principaux

  • OptimalControl.jl : permet de modéliser, résoudre et analyser des OCPs (directes/indirectes, CPU/GPU)
  • OptimalControlProblems.jl : bibliothèque de problèmes (modélisations JuMP, ADNLPModel, ExaModel), prête pour le benchmarking

Briques internes clés et architecture

  • CTBase.jl : exceptions, fonctions utilitaires
  • CTModels.jl : types des modèles, solutions, setters, getters et visualisation
  • CTDirect.jl : discrétisation (OCP → NLP) et résolution du problème NLP
  • CTFlows.jl : flots de systèmes dynamiques
  • CTParser.jl : définition abstraite (Domain-Specific-Language) et parsing
Architecture modulaire et cohérente

💡 Architecture modulaire

3. Pourquoi Julia ?

Julia est un langage performant, de haut niveau.

  • Performances : compilation JIT et fonctions type stable → code machine optimisé
  • Syntaxe expressive : proche des notations mathématiques, avec prise en charge d’Unicode
julia> f(α, β) = α^2 + 3β^2

julia> ∇f(α, β) = [
  2α, 
  6β
]

julia> ∇f(1.0, 2.0)
2-element Vector{Float64}:
  2.0
 12.0

🌐 Écosystème riche et spécialisé

  • AD & EDO : ForwardDiff.jl, Zygote.jl, DifferentialEquations.jl
  • Optimisation : JuMP.jl, JuliaSmoothOptimizers, MadNLP.jl, ExaModels.jl, ADNLPModels.jl
  • GPU : CUDA.jl, KernelAbstractions.jl, CUDSS.jl
  • DSL : MLStyle.jl, Moshi.jl pour le pattern matching

Avantages clés : modélisation intuitive, parallélisme SIMD/GPU, extensibilité, différentiation automatique...

4. Exemple minimaliste : double intégrateur

Problème : Trouver la paire trajectoire-commande optimale pour amener le système du double intégrateur () depuis la position jusqu'à la position en minimisant l'énergie de la commande.

Formulation mathématique

Avec OptimalControl.jl

using OptimalControl

ocp = @def begin
    t ∈ [0, 1], time
    x ∈ R², state
    u ∈ R, control

    x(0) == [-1, 0]
    x(1) == [0, 0]

    ∂(x)(t) == [x₂(t), u(t)]

    0.5∫(u(t)^2) → min
end

Résolution et visualisation

Résolution

using NLPModelsIpopt
sol = solve(ocp)

Visualisation

using Plots
plot(sol)




Architecture SIMD (Single Instruction on Multiple Data) et Performance


Autres exemples d'applications

5. Architecture logicielle et bonnes pratiques


🏗️ Séparation des responsabilités

  • Modèles : définition, manipulation et visualisation
  • Algorithmes : méthodes de transcription, intégrateurs
  • Interfaces : DSL proche des mathématiques

⚡ Performance

  • Différentiation automatique et compilation Julia
  • Structure creuse des problèmes discrétisés
  • Support natif CPU et GPU pour le calcul haute performance

🔄 Qualité logicielle

  • Intégration continue : tests, couverture, documentation
  • Benchmarks : suivi des performances (à améliorer → Guix)
  • Détection d'incompatibilités en amont
  • Workflows GitHub centralisés : CTActions

CTActions workflows

CTActions workflows

Détection d'incompatibilités

Détection d'incompatibilités

💡 Automatisation et surveillance de la qualité

📖 Ouverture et communauté

Reproductibilité

Reproductibilité

Communauté

  • Issues et discussions GitHub
  • Contributions bienvenues

Conclusion & Perspectives

Principaux atouts

  • Unifié : Approche unifiée pour les méthodes directes et indirectes
  • Modulaire : Architecture flexible et extensible
  • Performant : Exploitation des capacités de Julia
  • Communautaire : Documentation complète et écosystème en croissance

Prochaines étapes

  • Proposer de nouveaux algorithmes : méthode homotopique, raffinement de grille, multi-phases, hybride...
  • Extension de la collection de problèmes modélisés et benchmarking
  • Extension du DSL control-toolbox (CTDSL) : transformations abstraites, compilateur CTDSL ⟷ MTK (ModelingToolKit)

Ressources

LTeX: language=fr-FR