Skip to content

Commit b042746

Browse files
Merge pull request #812 from ChrisRackauckas-Claude/add-initializealg-docs
Add comprehensive DAE initialization documentation
2 parents 014f2c2 + ecfad69 commit b042746

File tree

2 files changed

+217
-0
lines changed

2 files changed

+217
-0
lines changed

docs/pages.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ pages = Any["index.md",
117117
"features/diffeq_operator.md",
118118
"features/noise_process.md",
119119
"features/linear_nonlinear.md",
120+
"features/dae_initialization.md",
120121
"features/callback_functions.md",
121122
"features/callback_library.md",
122123
"features/ensemble.md",
Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
# DAE Initialization
2+
3+
DAE (Differential-Algebraic Equation) problems often require special initialization procedures to ensure that the initial conditions are consistent with the algebraic constraints. The DifferentialEquations.jl ecosystem provides several initialization algorithms to handle this automatically or to verify that your provided initial conditions are already consistent.
4+
5+
## The Initialization Problem
6+
7+
DAEs have the general form:
8+
9+
```math
10+
M \frac{du}{dt} = f(u, p, t)
11+
```
12+
13+
where `M` is a (possibly singular) mass matrix. For the initial conditions `u₀` and `du₀` to be consistent, they must satisfy:
14+
15+
```math
16+
f(du₀, u₀, p, t₀) = 0
17+
```
18+
19+
for fully implicit DAEs, or the equivalent constraint for semi-explicit DAEs. Finding consistent initial conditions is a nonlinear problem that must be solved before time integration can begin.
20+
21+
## Available Initialization Algorithms
22+
23+
The `initializealg` keyword argument to `solve` controls how initialization is performed. All algorithms are documented with their docstrings:
24+
25+
```@docs
26+
DiffEqBase.DefaultInit
27+
DiffEqBase.CheckInit
28+
DiffEqBase.NoInit
29+
DiffEqBase.OverrideInit
30+
DiffEqBase.BrownBasicInit
31+
DiffEqBase.ShampineCollocationInit
32+
```
33+
34+
## ⚠️ WARNING: NoInit Usage
35+
36+
!!! warn "Use NoInit at your own risk"
37+
**`NoInit()` should almost never be used.** No algorithm has any guarantee of correctness if `NoInit()` is used with inconsistent initial conditions. Users should almost always use `CheckInit()` instead for safety.
38+
39+
**Important:**
40+
- Any issues opened that are using `NoInit()` will be immediately closed
41+
- Allowing incorrect initializations is not a supported part of the system
42+
- Using `NoInit()` with inconsistent conditions can lead to:
43+
- Solver instability and crashes
44+
- Incorrect results that may appear plausible
45+
- Undefined behavior in the numerical algorithms
46+
- Silent corruption of the solution
47+
48+
**When to use `CheckInit()` instead:**
49+
- When you believe your initial conditions are consistent
50+
- When you want to skip automatic modification of initial conditions
51+
- When you need to verify your manual initialization
52+
53+
The only valid use case for `NoInit()` is when you are 100% certain your conditions are consistent AND you need to skip the computational cost of verification for performance reasons in production code that has been thoroughly tested.
54+
55+
## Algorithm Selection Guide
56+
57+
| Algorithm | When to Use | Modifies Variables |
58+
|-----------|-------------|-------------------|
59+
| `DefaultInit()` | Default choice - automatically selects appropriate method | Depends on selection |
60+
| `CheckInit()` | When you've computed consistent conditions yourself | No (verification only) |
61+
| `NoInit()` | ⚠️ **AVOID** - Only for verified consistent conditions | No |
62+
| `OverrideInit()` | With ModelingToolkit problems | Yes (uses custom problem) |
63+
| `BrownBasicInit()` | For index-1 DAEs with `differential_vars` | Algebraic variables only |
64+
| `ShampineCollocationInit()` | For general DAEs without structure information | All variables |
65+
66+
## Examples
67+
68+
### Example 1: Simple Pendulum DAE
69+
70+
```julia
71+
using DifferentialEquations
72+
73+
function pendulum!(res, du, u, p, t)
74+
x, y, T = u
75+
dx, dy, dT = du
76+
g, L = p
77+
78+
res[1] = dx - du[1]
79+
res[2] = dy - du[2]
80+
res[3] = x^2 + y^2 - L^2 # Algebraic constraint
81+
end
82+
83+
u0 = [1.0, 0.0, 0.0] # Initial position
84+
du0 = [0.0, 0.0, 0.0] # Initial velocity (inconsistent!)
85+
p = [9.81, 1.0] # g, L
86+
tspan = (0.0, 10.0)
87+
88+
prob = DAEProblem(pendulum!, du0, u0, tspan, p,
89+
differential_vars = [true, true, false])
90+
91+
# BrownBasicInit will fix the inconsistent du0
92+
sol = solve(prob, DFBDF(), initializealg = BrownBasicInit())
93+
```
94+
95+
### Example 2: Checking Consistency (Recommended over NoInit)
96+
97+
```julia
98+
# If you've computed consistent conditions yourself
99+
u0_consistent = [1.0, 0.0, 0.0]
100+
du0_consistent = [0.0, -1.0, compute_tension(u0_consistent, p)]
101+
102+
prob2 = DAEProblem(pendulum!, du0_consistent, u0_consistent, tspan, p,
103+
differential_vars = [true, true, false])
104+
105+
# RECOMMENDED: Verify they're consistent with CheckInit
106+
sol = solve(prob2, DFBDF(), initializealg = CheckInit())
107+
108+
# NOT RECOMMENDED: NoInit skips all checks - use at your own risk!
109+
# sol = solve(prob2, DFBDF(), initializealg = NoInit()) # ⚠️ DANGEROUS
110+
```
111+
112+
### Example 3: ModelingToolkit Integration
113+
114+
When using ModelingToolkit, initialization information is often included automatically:
115+
116+
```julia
117+
using ModelingToolkit, DifferentialEquations
118+
119+
@variables t x(t) y(t) T(t)
120+
@parameters g L
121+
D = Differential(t)
122+
123+
eqs = [
124+
D(x) ~ -T * x/L,
125+
D(y) ~ -T * y/L - g,
126+
x^2 + y^2 ~ L^2
127+
]
128+
129+
@named pendulum = ODESystem(eqs, t, [x, y, T], [g, L])
130+
sys = structural_simplify(pendulum)
131+
132+
# ModelingToolkit provides initialization_data
133+
prob = DAEProblem(sys, [x => 1.0, y => 0.0], (0.0, 10.0), [g => 9.81, L => 1.0])
134+
135+
# DefaultInit will use OverrideInit with ModelingToolkit's initialization_data
136+
sol = solve(prob, DFBDF()) # Automatic initialization!
137+
```
138+
139+
## Algorithm-Specific Options
140+
141+
Both OrdinaryDiffEq and Sundials support the same initialization algorithms through the `initializealg` parameter:
142+
143+
### OrdinaryDiffEq and Sundials
144+
145+
```julia
146+
using OrdinaryDiffEq
147+
# or
148+
using Sundials
149+
150+
# Use Brown's algorithm to fix inconsistent conditions
151+
sol = solve(prob, DFBDF(), initializealg = BrownBasicInit()) # OrdinaryDiffEq
152+
sol = solve(prob, IDA(), initializealg = BrownBasicInit()) # Sundials
153+
154+
# Use Shampine's collocation method for general DAEs
155+
sol = solve(prob, DFBDF(), initializealg = ShampineCollocationInit()) # OrdinaryDiffEq
156+
sol = solve(prob, IDA(), initializealg = ShampineCollocationInit()) # Sundials
157+
158+
# RECOMMENDED: Verify conditions are consistent
159+
sol = solve(prob, DFBDF(), initializealg = CheckInit()) # OrdinaryDiffEq
160+
sol = solve(prob, IDA(), initializealg = CheckInit()) # Sundials
161+
162+
# NOT RECOMMENDED: Skip all initialization checks (dangerous!)
163+
# sol = solve(prob, DFBDF(), initializealg = NoInit()) # ⚠️ USE AT YOUR OWN RISK
164+
# sol = solve(prob, IDA(), initializealg = NoInit()) # ⚠️ USE AT YOUR OWN RISK
165+
```
166+
167+
## Troubleshooting
168+
169+
### Common Issues and Solutions
170+
171+
1. **"Initial conditions are not consistent" error**
172+
- Ensure your `du0` satisfies the DAE constraints at `t0`
173+
- Try using `BrownBasicInit()` or `ShampineCollocationInit()` instead of `CheckInit()`
174+
- Check that `differential_vars` correctly identifies differential vs algebraic variables
175+
176+
2. **Initialization fails to converge**
177+
- Relax tolerances if using extended versions
178+
- Try a different initialization algorithm
179+
- Provide a better initial guess for algebraic variables
180+
- **Check if your DAE is index-1**: The system may be higher-index (see below)
181+
182+
3. **Solver fails immediately after initialization**
183+
- The initialization might have found a consistent but numerically unstable point
184+
- Try tightening initialization tolerances
185+
- Check problem scaling and consider non-dimensionalization
186+
187+
4. **DAE is not index-1 (higher-index DAE)**
188+
- Many initialization algorithms only work reliably for index-1 DAEs
189+
- **To check if your DAE is index-1**: The Jacobian of the algebraic equations with respect to the algebraic variables must be non-singular
190+
- **Solution**: Use ModelingToolkit.jl to analyze and potentially reduce the index:
191+
```julia
192+
using ModelingToolkit
193+
194+
# Define your system with ModelingToolkit
195+
@named sys = ODESystem(eqs, t, vars, params)
196+
197+
# Analyze and reduce the index (structural_simplify handles this in v10+)
198+
sys_reduced = structural_simplify(sys)
199+
200+
# The reduced system will be index-1 and easier to initialize
201+
prob = DAEProblem(sys_reduced, [], (0.0, 10.0), params)
202+
```
203+
- ModelingToolkit can automatically detect the index and apply appropriate transformations
204+
- After index reduction, standard initialization algorithms will work more reliably
205+
206+
## Performance Tips
207+
208+
1. **Use `differential_vars` when possible**: This helps initialization algorithms understand problem structure
209+
2. **Provide good initial guesses**: Even when using automatic initialization, starting closer to the solution helps
210+
3. **Consider problem-specific initialization**: For complex systems, custom initialization procedures may be more efficient
211+
4. **Use `CheckInit()` when appropriate**: If you know conditions are consistent, skip unnecessary computation
212+
213+
## References
214+
215+
- Brown, P. N., Hindmarsh, A. C., & Petzold, L. R. (1998). Consistent initial condition calculation for differential-algebraic systems. SIAM Journal on Scientific Computing, 19(5), 1495-1512.
216+
- Shampine, L. F. (2002). Consistent initial condition for differential-algebraic systems. SIAM Journal on Scientific Computing, 22(6), 2007-2026.

0 commit comments

Comments
 (0)