You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|[Interesso.jl](https://github.com/JuDO-dev/Interesso.jl)| Integrated Residuals solver via Ipopt | Active development |
18
+
19
+
See the [Packages](/Packages/) page for full descriptions, API references, and installation instructions.
20
+
21
+
---
22
+
23
+
## Contributors
24
+
25
+
**Team owner:** Professor Eric Kerrigan ([@erickerrigan](https://github.com/erickerrigan))
26
+
27
+
**JuDO:** Haochen Tao ([@shawn-tao01](https://github.com/shawn-tao01)), Eduardo Vila ([@e-duar-do](https://github.com/e-duar-do))
28
+
29
+
**DynOptInterface:** Haochen Tao ([@shawn-tao01](https://github.com/shawn-tao01)), Eduardo Vila ([@e-duar-do](https://github.com/e-duar-do))
30
+
31
+
**Interesso:** Lucian Nita ([@LucianNita](https://github.com/LucianNita)), Eduardo Vila ([@e-duar-do](https://github.com/e-duar-do)), Lester ([@Kailai-Shi](https://github.com/Kailai-Shi)), Haochen Tao ([@shawn-tao01](https://github.com/shawn-tao01))
32
+
33
+
---
34
+
35
+
## Organisation
36
+
37
+
JuDO is developed and maintained by the [JuDO-dev](https://github.com/JuDO-dev) organisation on GitHub.
38
+
39
+
---
40
+
41
+
## Contributing
42
+
43
+
All packages are open to contributions. The best starting points are:
44
+
45
+
-**Bug reports and feature requests**: open an issue on the relevant GitHub repository
46
+
-**New solvers**: implement your solver with a wrapper compatible to the [DynOptInterface](https://github.com/JuDO-dev/DynOptInterface.jl) to make your solver accessible from JuDO
47
+
-**Documentation**: improvements to any of the package docs are always welcome
## Space Shuttle Reentry \{#space_shuttle_reentry\}
154
154
155
-
This benchmark problem, due to Betts (2010), optimises the reentry trajectory of a space shuttle to **maximise the crossrange** (final latitude $\theta(t_f)$), subject to full six-state atmospheric flight dynamics and terminal boundary conditions. The reference optimal crossrange is approximately **34.14°**.
155
+
This benchmark problem, optimizes the reentry trajectory of a space shuttle to **maximise the crossrange** (final latitude $\theta(t_f)$), subject to full six-state atmospheric flight dynamics and terminal boundary conditions. The reference optimal crossrange is approximately **34.14°**.
Copy file name to clipboardExpand all lines: Packages.md
+31-19Lines changed: 31 additions & 19 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,21 +4,44 @@
4
4
5
5
# JuDO Packages
6
6
7
-
The JuDO ecosystem consists of three main packages arranged in a layered architecture modelled after JuMP / MathOptInterface.
7
+
The JuDO ecosystem consists of two main packages arranged in a layered architecture.
8
+
9
+
---
10
+
11
+
## Design philosophy
12
+
13
+
JuDO has a layered architecture modelled on JuMP / MathOptInterface:
14
+
15
+
```
16
+
User code (JuDO macros — @phase, @variable, @constraint, @objective...)
17
+
│
18
+
▼
19
+
JuDO.jl
20
+
│
21
+
▼
22
+
DynOptInterface.jl (DOI)
23
+
/ \
24
+
/ \
25
+
▼ ▼
26
+
Interesso.jl Other DOI-compatible
27
+
│ solvers...
28
+
▼
29
+
NLP solver (Ipopt)
30
+
8
31
9
32
---
10
33
11
34
## JuDO.jl
12
35
13
36
**The user-facing modelling layer.**
14
37
15
-
JuDO.jl extends [JuMP](https://jump.dev) with constructs for continuous-time dynamic optimisation: time phases, trajectory variables, derivatives, boundary operators, and integral objectives. Problems are formulated in a solver-agnostic syntax and translated automatically into the DynOptInterface (DOI) standard representation.
38
+
JuDO.jl extends [JuMP](https://jump.dev) with constructs for dynamic optimization: time phases, trajectory variables, derivatives, boundary operators, and integral objectives. Problems are formulated in a solver-agnostic syntax and translated automatically into the DynOptInterface (DOI) standard representation.
16
39
17
40
Key modelling constructs:
18
41
19
42
| Macro / Function | Purpose |
20
43
|-----------------|---------|
21
-
|`DynModel(optimizer)`| Create a dynamic optimisation model |
44
+
| `DynModel(optimizer)` | Create a dynamic optimization model |
22
45
| `@phase(model, t)` | Declare the independent variable (time) |
23
46
| `@variable(model, bounds, DefinedOn(t))` | Declare a trajectory variable |
24
47
| `initial(x)`, `final(x)` | Access trajectory endpoints in constraints |
@@ -38,7 +61,7 @@ Key modelling constructs:
38
61
39
62
**The mathematical abstraction layer (DOI).**
40
63
41
-
DynOptInterface.jl (DOI) is to dynamic optimisation what MathOptInterface (MOI) is to static mathematical programming. It defines a standard intermediate representation for Dynamic Optimisation Problems (DOPs) that solvers can attach to.
64
+
DynOptInterface.jl (DOI) is to dynamic optimization what MathOptInterface (MOI) is to static mathematical programming. It defines a standard intermediate representation for Dynamic optimization Problems (DOPs) that solvers can attach to.
42
65
43
66
The general problem form DOI represents:
44
67
@@ -53,7 +76,7 @@ Key abstractions:
53
76
| Type | Purpose |
54
77
|------|---------|
55
78
| `Phase` | A time interval $[t_0, t_f]$ with variable boundaries |
56
-
|`DynamicVariable`| An optimisable trajectory $y(t)$ |
79
+
| `DynamicVariable` | An optimizable trajectory $y(t)$ |
Interesso.jl is a concrete solver implementing the DynOptInterface. It transcribes continuous-time DOPs into large-scale Nonlinear Programs (NLPs) using an **Integrated Residuals Method** (IRM) — collocation at Gaussian quadrature nodes — and dispatches them to [Ipopt](https://coin-or.github.io/Ipopt/).
96
+
Interesso.jl is a solver we develop that could attach to the DynOptInterface. It transcribes continuous-time DOPs into large-scale Nonlinear Programs (NLPs) using an **Integrated Residuals Method** (IRM) and dispatches them to [Ipopt](https://coin-or.github.io/Ipopt/).
74
97
75
98
Features:
76
-
- Multi-phase dynamic optimisation
99
+
- Multi-phase dynamic optimization
77
100
- Explicit and implicit ODE dynamics
78
101
- Free final time
79
102
- NLP warm-starting via `JuDO.warmstart!`
@@ -99,15 +122,4 @@ Features:
99
122
100
123
---
101
124
102
-
## Installation
103
-
104
-
All packages are under active development and not yet registered in the Julia General registry. Install from GitHub:
Copy file name to clipboardExpand all lines: index.md
+40-71Lines changed: 40 additions & 71 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,7 +3,14 @@
3
3
@def hascode = true
4
4
@def hasmath = true
5
5
6
-
**JuDO.jl** is a Julia package for formulating and solving dynamic optimisation problems (optimal control, trajectory optimisation, and more). It extends the [JuMP](https://jump.dev) modelling language with continuous-time variables, differential equations, and integral objectives — keeping solver details out of your model code.
6
+
# About JuDO
7
+
8
+
**JuDO** (Julia for Dynamic optimization) is an open-source modeling language developing a modern, solver-agnostic ecosystem for packages for dynamic optimization in Julia.
9
+
10
+
Dynamic optimization problems arises across engineering fields (spacecraft trajectory design, robot motion planning, process control, etc.).
11
+
JuDO provides a simple formulation layer for users to define their problems mathematically, and an underlying abstracton layer DynOptInterface that provides necessary transformations to fit the dynamic-optimization solver.
12
+
13
+
---
7
14
8
15
# As easy as one-two-three
9
16
@@ -22,87 +29,49 @@ Julia 1.12 or later is required.
22
29
23
30
## 2. Define your problem
24
31
25
-
The example below solves the classic **cart-pole swing-up**: a pendulum on a cart must be swung from hanging ($\theta=0$) to upright ($\theta=\pi$) by a horizontal force, while minimising total control effort $\int_0^{t_f} u^2 \, dt$.
32
+
The example below solves a classic LQR problem formulation.
26
33
27
34
```julia
28
-
using JuDO, Interesso
29
-
30
-
const g =9.81; const l =0.5; const m_1 =1.0; const m_2 =0.3
31
-
const u_max =20.0; const r_max =2.0
32
-
33
-
dop =DynModel(Interesso.Optimizer)
34
-
35
-
# Independent variable (time phase)
36
-
@phase(dop, t)
37
-
@constraint(dop, initial(t) ==0)
38
-
@constraint(dop, final(t) ==2)
39
-
40
-
# States
41
-
@variable(dop, 0<= r <= r_max, DefinedOn(t)) # cart position (m)
See the [Examples](/Examples/) page for the full annotated code and the aerospace [Space Shuttle Reentry](/Examples/#space_shuttle_reentry) benchmark (maximising crossrange; reference solution ≈ 34.14°).
58
+
## Objective
59
+
@objective(model, Min, integral(2*x^2+2*v^2))
94
60
95
-
---
61
+
JuDO.optimize!(model)
96
62
97
-
# The JuDO ecosystem
63
+
## Extract solutions
64
+
t_0 =phase_initial(t).value
65
+
t_f =10.0
98
66
99
-
JuDO follows the same layered architecture as JuMP / MathOptInterface:
67
+
x_sol =dyn_value(model, x)
68
+
v_sol =dyn_value(model, v)
69
+
u_sol =dyn_value(model, u)
100
70
101
-
| Layer | Package | Role |
102
-
|-------|---------|------|
103
-
|**Modelling**|[JuDO.jl](https://github.com/JuDO-dev/JuDO.jl)| Solver-agnostic problem formulation |
104
-
|**Interface**|[DynOptInterface.jl](https://github.com/shawn-tao01/DynOptInterface.jl)| Standard intermediate representation for dynamic optimisation |
105
-
|**Solver**|[Interesso.jl](https://github.com/Kailai-Shi/Interesso.jl)| Collocation-based NLP transcription via Ipopt |
A problem written in JuDO can in principle be solved by any solver that implements the DynOptInterface (DOI) standard — with no changes to the model code.
108
-
See the [Packages](/Packages/) page for details on each package.
0 commit comments