Complete
SINDy vs. ISINDy on the Lorenz System
Recovering the Lorenz equations from data with sparse regression, and making it robust to noise.
- Coefficient error at 5% noise: SINDy98.5%
- Coefficient error at 5% noise: ISINDy3.3%
Equation discovery with SINDy
SINDy (Sparse Identification of Non-linear Dynamics) discovers governing equations from data. Given state measurements , a library of candidate functions and a coefficient matrix , it looks for the sparsest such that
minimising with the STLSQ (Sequential Thresholded Least Squares) algorithm. The test case is the Lorenz system.
The problem: noise
Standard SINDy needs the derivative , and numerical differentiation amplifies high-frequency noise, so on noisy data it often fails to find the true dynamics.
The fix: Integral SINDy (ISINDy)
ISINDy integrates the equations in time instead:
Integration acts as a low-pass temporal filter and removes the need to differentiate noisy data, which makes the regression far more robust.
Part of my research internship with Prof. Saurav Sengupta, IIT (ISM) Dhanbad.
True vs. discovered
Non-zero coefficients: true system 7, SINDy 60, ISINDy 8. The sparser the fit, the closer it is to the real physics.
| term | true | SINDy | ISINDy |
|---|---|---|---|
| 1 | · | 1.456 | · |
| x | −σ | 15.784 | −9.960 |
| y | σ | −1.790 | 9.978 |
| z | · | −0.825 | · |
| x² | · | −0.090 | · |
| xy | · | −0.180 | · |
| xz | · | −1.283 | · |
| y² | · | 0.125 | · |
| yz | · | 0.388 | · |
| z² | · | 0.077 | · |
| x³ | · | 0.250 | · |
| x²y | · | −0.395 | · |
| x²z | · | 0.008 | · |
| xy² | · | 0.245 | · |
| xz² | · | 0.010 | · |
| y³ | · | −0.054 | · |
| y²z | · | −0.002 | · |
| yz² | · | 0.002 | · |
| z³ | · | −0.002 | · |
| x³z | · | −0.004 | · |
| x²yz | · | 0.007 | · |
| xy²z | · | −0.005 | · |
| y³z | · | 0.001 | · |
| term | true | SINDy | ISINDy |
|---|---|---|---|
| 1 | · | 1.569 | · |
| x | ρ | 19.964 | 27.654 |
| y | −1 | 2.851 | −0.849 |
| z | · | −0.707 | · |
| x² | · | 0.027 | · |
| xy | · | −0.350 | · |
| xz | −1 | −0.579 | −0.993 |
| y² | · | 0.184 | · |
| yz | · | −0.174 | · |
| z² | · | 0.065 | · |
| x³ | · | −0.001 | · |
| x²z | · | 0.005 | · |
| xyz | · | 0.005 | · |
| xz² | · | −0.005 | · |
| y²z | · | −0.004 | · |
| yz² | · | 0.002 | · |
| z³ | · | −0.002 | · |
| term | true | SINDy | ISINDy |
|---|---|---|---|
| 1 | · | 5.746 | −0.951 |
| x | · | −5.549 | · |
| y | · | 2.497 | · |
| z | −β | −4.185 | −2.626 |
| x² | · | −0.360 | · |
| xy | 1 | 0.998 | 0.999 |
| xz | · | 0.412 | · |
| y² | · | 0.099 | · |
| yz | · | −0.150 | · |
| z² | · | 0.105 | · |
| x³ | · | 0.020 | · |
| x²y | · | −0.007 | · |
| x²z | · | 0.012 | · |
| xy² | · | −0.006 | · |
| xyz | · | −0.002 | · |
| xz² | · | −0.008 | · |
| y³ | · | 0.002 | · |
| y²z | · | −0.002 | · |
| yz² | · | 0.002 | · |
| z³ | · | −0.002 | · |
Library: all 35 monomials up to degree 4 (scikit-learn PolynomialFeatures). Fitted with STLSQ on 100,000 samples with 5% Gaussian noise (SINDy threshold 0.001, ISINDy 0.06). Printed to 3 decimals, so "·" can hide terms smaller than 0.0005.