This release introduces a wide range of new and advanced functionality for PySINDy users, which enables the identification of implicit differential equations (SINDy-PI), partial differential equations (PDE-FIND), and weak-formulation differential equations for both ODEs and PDEs. Several new sparse regression optimizers are added, system identification with inequality constraints is now implemented, and ensembling methods are available with all the optimizers, significantly improving performance on noisy data. We include several new Jupyter notebook examples where these advanced features are explained and used for system identification, and additionally revamp a number of existing example notebooks.
References
- Please see [this paper](https://arxiv.org/abs/2111.08481) for an overview of all the new tools available in this new release.
- See [this Youtube playlist](https://www.youtube.com/playlist?list=PLN90bHJU-JLoOfEk0KyBs2qLTV7OkMZ25) for tips on using pysindy in practice and examples of new functionality.
Other updates
- Added a `TensoredLibrary` class which allows one to combine two feature libraries together by taking all possible pairs of terms and use multiplication syntax like `PolynomialLibrary() * FourierLibrary()`.
- Additionally, we implement a `GeneralizedLibrary` class for concatenating and tensoring N different feature libraries together. Also allows each of the feature libraries to only use a subset of the input variables, and users can specify which of the libraries to tensor product together, for maximum flexibility (see Issue 134).
- All optimizers now have the `normalize_columns` parameter, which normalizes each column of the feature library to magnitude 1 before performing the optimization. This often helps on systems with a wide range of scales.
- The scikit-learn bug mentioned in Issues 124, 129, 130, and 131 is now fixed, so users can use PySINDy with scikit-learn versions >= 1.0.
- The `normalize` option previously provided by our optimizers is deprecated. Please use the `normalize_columns` argument instead.
- A large number of common ODEs have been added to the utils/odes.py file for reuse, and we would be happy if users would like to add additional systems.
- PySINDy has switched default ODE solvers from `odeint` to `solve_ivp`. Note that `solve_ivp` defaults to the RK45 numerical solver. To reproduce old examples that used `odeint`, use `solve_ivp` with the following argument: method='LSODA', `atol` and `rtol` below 1e-12. This is the default behavior when calling `SINDy.simulate`.