Here’s an example of optimization on a 1000 ODE system. It takes a few seconds.
https://diffeqflux.sciml.ai/dev/examples/pde_constrained/
It uses the adjoints that @stevengj describes by default. Exquisite amounts of detail can be found in this page, though for most folks it shouldn’t be too necessary.
If you want the details on how to scale to very large systems, this tutorial covers how to choose solvers and preconditioners for handling large PDE solves:
https://diffeq.sciml.ai/stable/tutorials/advanced_ode_example/
The end of that tutorial shows how to solve a 2000 ODE system in 87 ms.
DiffEqParamEstim is just a simplified parameter estimation system. DiffEqFlux uses GalacticOptim internally, and soon it will be more explicitly. The core is really just that differentiating DifferentialEquations.jl uses adjoints, and you can use that with any optimization package.