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

Olivier Cots – CNRS, Toulouse INP, IRIT

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

MeetUp Julia, Observatoire de Paris, 25 septembre 2025

Contexte

Le projet control-toolbox rassemble plusieurs packages Julia pour modéliser et résoudre des problèmes de contrôle optimal.

  • Package central : OptimalControl.jl
  • Architecture modulaire et performante
  • Calcul CPU et GPU
  • Connexion fluide entre :
    • formulation mathématique,
    • simulation,
    • optimisation avancée

1. Introduction

  • Contrôle optimal = trajectoire optimale d’un système dynamique contrôlé sous contraintes
  • Domaine : math appliquées, optimisation, simulation numérique
  • Applications : robotique, aéronautique, finance, énergie

Transfert Terre–Lune – Mission Apollo XI

2. Pourquoi Julia ?

Julia est un langage de haut niveau, rapide et dynamique, idéal pour le calcul scientifique et le contrôle optimal.

  • Performances : compilation JIT et fonctions stables en type → code machine optimisé
  • Syntaxe expressive : proche des notations mathématiques, support Unicode
julia> f(x₁, x₂) = x₁^2 + 3x₂^2

julia> ∇f(x₁, x₂) = [
  2x₁, 
  6x₂
]

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...

3. Panorama de control-toolbox

Packages principaux

  • OptimalControl.jl : DSL pour modéliser et résoudre des OCPs (directes/indirectes, CPU/GPU)
  • OptimalControlProblems.jl : bibliothèque de problèmes de référence, prête pour benchmarking et comparaisons

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 et résolution
  • CTFlows.jl : systèmes hamiltoniens et flots
  • CTParser.jl : définition abstraite et parser
Architecture modulaire et cohérente

💡 Architecture modulaire

4. Exemple minimaliste : double intégrateur

Problème : Trouver le contrôle optimal pour amener un système de la position à en minimisant l'énergie du contrôle.

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]

    ẋ(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

Discrétisation du problème de contrôle optimal



Autre exemple

Minimum time orbit transfer

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
  • Tests unitaires : modèles, solveurs, API
  • Benchmarks : suivi des performances
  • Détection d'incompatibilités avec les dépendances

Actions CI/CD

Actions CI/CD

Détection d'incompatibilités

Détection d'incompatibilités

💡 Automatisation et surveillance de la qualité

📖 Ouverture et communauté

Reproductibilité

Reproductibilité

Communauté active

  • Issues et discussions GitHub
  • Contributions bienvenues
  • Environnements reproductibles

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

  • Extension de l'écosystème : Méthodes indirectes, homotopiques, raffinement de grille...
  • Renforcement de la communauté : applications, tutoriels, algorithmes...

Ressources