dynamicslab / pysindy

A package for the sparse identification of nonlinear dynamical systems from data
https://pysindy.readthedocs.io/en/latest/
Other
1.36k stars 304 forks source link

[Help] Can't get the right model for 2d system #441

Closed antono0106 closed 6 months ago

antono0106 commented 6 months ago

I'm using PYSINDY library to reconstruct this 2D system:

image

Which can be rewritten as:

image

With parameters: a10=1, a11=2, a12=3, a20=0, a22=-3, b22=0.0125, v=0.992, e1=1, e2=-1

The plot seems to be correct:

image

But the none of the output models match to the rewritten one:

Model  1
Model  2
Model  3
Model  4
Model  5
Model  6
Model  7
Model  8
Model  9
Model  10
Model  11
Model  12
Model  13
Model  14
Model  15
Model  16
Model  17
Model  18
Model  19
Model  20
Model  21
Model  22
Model  23
Model  24
Model  25
Model  26
Model  27
Model  28
Model  29
1 = 0.028 x0 + -3.393 x1 + -0.038 x0x0 + -0.852 x1x1 + -0.090 x0x1 + 0.069 cos(x0) + 1.679 cos(x1) + -0.049 sin(x0) + 2.504 sin(x1) + -0.203 x0_dot + 0.050 x1_dot + -0.556 x0x0_dot + -0.664 x1x0_dot + 0.250 x0x0x0_dot + -0.201 x1x1x0_dot + 0.040 x0x1x0_dot + 0.147 cos(x0)x0_dot + -0.048 cos(x1)x0_dot + 0.473 sin(x0)x0_dot + 0.856 sin(x1)x0_dot + -0.187 x0x1_dot + -0.073 x1x1_dot + 0.108 x0x0x1_dot + -0.016 x1x1x1_dot + 0.084 x0x1x1_dot + -0.062 cos(x0)x1_dot + -0.110 cos(x1)x1_dot + 0.198 sin(x0)x1_dot + 0.327 sin(x1)x1_dot
x0 = 0.001 1 + -0.790 x1 + 0.242 x0x0 + -0.211 x1x1 + -0.025 x0x1 + -0.368 cos(x0) + 0.259 cos(x1) + 0.558 sin(x0) + 0.516 sin(x1) + -0.076 x0_dot + -0.070 x1_dot + 0.032 x0x0_dot + -0.174 x1x0_dot + 0.013 x0x0x0_dot + -0.046 x1x1x0_dot + 0.012 x0x1x0_dot + 0.108 cos(x0)x0_dot + 0.009 cos(x1)x0_dot + 0.023 sin(x0)x0_dot + 0.178 sin(x1)x0_dot + 0.163 x0x1_dot + -0.024 x1x1_dot + -0.026 x0x0x1_dot + -0.001 x1x1x1_dot + 0.013 x0x1x1_dot + 0.129 cos(x0)x1_dot + -0.008 cos(x1)x1_dot + -0.063 sin(x0)x1_dot + 0.059 sin(x1)x1_dot
x1 = -0.125 1 + -0.602 x0 + 0.132 x0x0 + -0.276 x1x1 + -0.051 x0x1 + -0.211 cos(x0) + 0.390 cos(x1) + 0.341 sin(x0) + 0.712 sin(x1) + -0.067 x0_dot + -0.032 x1_dot + -0.053 x0x0_dot + -0.206 x1x0_dot + 0.042 x0x0x0_dot + -0.059 x1x1x0_dot + 0.015 x0x1x0_dot + 0.086 cos(x0)x0_dot + -0.013 cos(x1)x0_dot + 0.073 sin(x0)x0_dot + 0.243 sin(x1)x0_dot + 0.078 x0x1_dot + -0.025 x1x1_dot + -0.002 x0x0x1_dot + -0.003 x1x1x1_dot + 0.022 x0x1x1_dot + 0.070 cos(x0)x1_dot + -0.031 cos(x1)x1_dot + -0.022 sin(x0)x1_dot + 0.087 sin(x1)x1_dot
x0x0 = -0.028 1 + 3.867 x0 + 2.762 x1 + 0.647 x1x1 + -0.059 x0x1 + 1.399 cos(x0) + -0.876 cos(x1) + -2.086 sin(x0) + -1.679 sin(x1) + 0.296 x0_dot + 0.277 x1_dot + -0.128 x0x0_dot + 0.617 x1x0_dot + -0.035 x0x0x0_dot + 0.156 x1x1x0_dot + -0.037 x0x1x0_dot + -0.403 cos(x0)x0_dot + -0.079 cos(x1)x0_dot + -0.098 sin(x0)x0_dot + -0.583 sin(x1)x0_dot + -0.631 x0x1_dot + 0.089 x1x1_dot + 0.104 x0x0x1_dot + 0.011 x1x1x1_dot + -0.033 x0x1x1_dot + -0.493 cos(x0)x1_dot + -0.013 cos(x1)x1_dot + 0.209 sin(x0)x1_dot + -0.194 sin(x1)x1_dot
x1x1 = -0.373 1 + -1.911 x0 + -3.287 x1 + 0.367 x0x0 + -0.302 x0x1 + -0.703 cos(x0) + 1.268 cos(x1) + 1.183 sin(x0) + 2.472 sin(x1) + -0.203 x0_dot + -0.098 x1_dot + -0.148 x0x0_dot + -0.724 x1x0_dot + 0.135 x0x0x0_dot + -0.214 x1x1x0_dot + 0.053 x0x1x0_dot + 0.282 cos(x0)x0_dot + -0.077 cos(x1)x0_dot + 0.199 sin(x0)x0_dot + 0.874 sin(x1)x0_dot + 0.265 x0x1_dot + -0.116 x1x1_dot + -0.011 x0x0x1_dot + -0.014 x1x1x1_dot + 0.079 x0x1x1_dot + 0.233 cos(x0)x1_dot + -0.131 cos(x1)x1_dot + -0.123 sin(x0)x1_dot + 0.323 sin(x1)x1_dot
x0x1 = -0.167 1 + -0.945 x0 + -2.552 x1 + -0.143 x0x0 + -1.274 x1x1 + -0.481 cos(x0) + 0.995 cos(x1) + 1.142 sin(x0) + 2.580 sin(x1) + -0.065 x0_dot + -0.027 x1_dot + -0.034 x0x0_dot + -0.684 x1x0_dot + 0.105 x0x0x0_dot + -0.226 x1x1x0_dot + 0.068 x0x1x0_dot + 0.195 cos(x0)x0_dot + -0.249 cos(x1)x0_dot + -0.027 sin(x0)x0_dot + 0.983 sin(x1)x0_dot + 0.160 x0x1_dot + -0.181 x1x1_dot + -0.005 x0x0x1_dot + -0.005 x1x1x1_dot + 0.112 x0x1x1_dot + 0.144 cos(x0)x1_dot + -0.271 cos(x1)x1_dot + -0.320 sin(x0)x1_dot + 0.381 sin(x1)x1_dot
cos(x0) = 0.018 1 + -2.056 x0 + -1.541 x1 + 0.489 x0x0 + -0.432 x1x1 + -0.070 x0x1 + 0.599 cos(x1) + 1.119 sin(x0) + 1.178 sin(x1) + -0.209 x0_dot + -0.155 x1_dot + 0.124 x0x0_dot + -0.485 x1x0_dot + 0.013 x0x0x0_dot + -0.149 x1x1x0_dot + 0.001 x0x1x0_dot + 0.270 cos(x0)x0_dot + 0.046 cos(x1)x0_dot + 0.026 sin(x0)x0_dot + 0.514 sin(x1)x0_dot + 0.403 x0x1_dot + -0.150 x1x1_dot + -0.070 x0x0x1_dot + -0.043 x1x1x1_dot + 0.017 x0x1x1_dot + 0.299 cos(x0)x1_dot + 0.004 cos(x1)x1_dot + -0.149 sin(x0)x1_dot + 0.219 sin(x1)x1_dot
cos(x1) = 0.362 1 + 1.157 x0 + 2.288 x1 + -0.245 x0x0 + 0.625 x1x1 + 0.116 x0x1 + 0.481 cos(x0) + -0.640 sin(x0) + -1.695 sin(x1) + 0.182 x0_dot + 0.065 x1_dot + 0.179 x0x0_dot + 0.532 x1x0_dot + -0.116 x0x0x0_dot + 0.158 x1x1x0_dot + -0.026 x0x1x0_dot + -0.199 cos(x0)x0_dot + 0.011 cos(x1)x0_dot + -0.214 sin(x0)x0_dot + -0.624 sin(x1)x0_dot + -0.136 x0x1_dot + 0.098 x1x1_dot + -0.008 x0x0x1_dot + 0.021 x1x1x1_dot + -0.049 x0x1x1_dot + -0.137 cos(x0)x1_dot + 0.060 cos(x1)x1_dot + 0.011 sin(x0)x1_dot + -0.239 sin(x1)x1_dot
sin(x0) = -0.007 1 + 1.671 x0 + 1.339 x1 + -0.391 x0x0 + 0.391 x1x1 + 0.089 x0x1 + 0.601 cos(x0) + -0.428 cos(x1) + -0.927 sin(x1) + 0.119 x0_dot + 0.114 x1_dot + -0.056 x0x0_dot + 0.314 x1x0_dot + -0.021 x0x0x0_dot + 0.085 x1x1x0_dot + -0.022 x0x1x0_dot + -0.178 cos(x0)x0_dot + -0.002 cos(x1)x0_dot + -0.024 sin(x0)x0_dot + -0.332 sin(x1)x0_dot + -0.269 x0x1_dot + 0.055 x1x1_dot + 0.043 x0x0x1_dot + 0.005 x1x1x1_dot + -0.024 x0x1x1_dot + -0.211 cos(x0)x1_dot + 0.024 cos(x1)x1_dot + 0.126 sin(x0)x1_dot + -0.116 sin(x1)x1_dot
sin(x1) = 0.169 1 + 0.723 x0 + 1.308 x1 + -0.147 x0x0 + 0.382 x1x1 + 0.094 x0x1 + 0.296 cos(x0) + -0.531 cos(x1) + -0.434 sin(x0) + 0.092 x0_dot + 0.037 x1_dot + 0.064 x0x0_dot + 0.306 x1x0_dot + -0.055 x0x0x0_dot + 0.094 x1x1x0_dot + -0.014 x0x1x0_dot + -0.116 cos(x0)x0_dot + 0.021 cos(x1)x0_dot + -0.089 sin(x0)x0_dot + -0.369 sin(x1)x0_dot + -0.101 x0x1_dot + 0.058 x1x1_dot + 0.003 x0x0x1_dot + 0.013 x1x1x1_dot + -0.028 x0x1x1_dot + -0.087 cos(x0)x1_dot + 0.044 cos(x1)x1_dot + 0.035 sin(x0)x1_dot + -0.143 sin(x1)x1_dot
x0_dot = -0.831 1 + -6.472 x0 + -7.437 x1 + 1.581 x0x0 + -1.899 x1x1 + -0.145 x0x1 + -3.182 cos(x0) + 3.467 cos(x1) + 3.387 sin(x0) + 5.557 sin(x1) + -0.513 x1_dot + -0.441 x0x0_dot + -2.466 x1x0_dot + 0.357 x0x0x0_dot + -0.715 x1x1x0_dot + 0.029 x0x1x0_dot + 1.009 cos(x0)x0_dot + 0.315 cos(x1)x0_dot + 0.788 sin(x0)x0_dot + 2.495 sin(x1)x0_dot + 1.061 x0x1_dot + -0.853 x1x1_dot + -0.114 x0x0x1_dot + -0.237 x1x1x1_dot + 0.116 x0x1x1_dot + 0.924 cos(x0)x1_dot + 0.059 cos(x1)x1_dot + -0.199 sin(x0)x1_dot + 1.112 sin(x1)x1_dot
x1_dot = 0.413 1 + -12.133 x0 + -7.286 x1 + 3.005 x0x0 + -1.869 x1x1 + -0.120 x0x1 + -4.820 cos(x0) + 2.493 cos(x1) + 6.603 sin(x0) + 4.580 sin(x1) + -1.043 x0_dot + 0.458 x0x0_dot + -2.062 x1x0_dot + 0.086 x0x0x0_dot + -0.494 x1x1x0_dot + 0.120 x0x1x0_dot + 1.306 cos(x0)x0_dot + 0.397 cos(x1)x0_dot + 0.250 sin(x0)x0_dot + 1.795 sin(x1)x0_dot + 2.101 x0x1_dot + -0.528 x1x1_dot + -0.373 x0x0x1_dot + -0.068 x1x1x1_dot + 0.106 x0x1x1_dot + 1.688 cos(x0)x1_dot + 0.145 cos(x1)x1_dot + -0.794 sin(x0)x1_dot + 0.640 sin(x1)x1_dot
x0x0_dot = -0.657 1 + 0.782 x0 + -1.700 x1 + -0.195 x0x0 + -0.402 x1x1 + -0.022 x0x1 + 0.540 cos(x0) + 0.982 cos(x1) + -0.458 sin(x0) + 1.127 sin(x1) + -0.128 x0_dot + 0.064 x1_dot + -0.734 x1x0_dot + 0.325 x0x0x0_dot + -0.163 x1x1x0_dot + 0.057 x0x1x0_dot + -0.044 cos(x0)x0_dot + 0.119 cos(x1)x0_dot + 0.726 sin(x0)x0_dot + 0.543 sin(x1)x0_dot + -0.498 x0x1_dot + -0.372 x1x1_dot + 0.155 x0x0x1_dot + -0.075 x1x1x1_dot + 0.065 x0x1x1_dot + -0.164 cos(x0)x1_dot + 0.022 cos(x1)x1_dot + 0.333 sin(x0)x1_dot + 0.278 sin(x1)x1_dot
x1x0_dot = -0.295 1 + -1.596 x0 + -2.489 x1 + 0.355 x0x0 + -0.733 x1x1 + -0.164 x0x1 + -0.798 cos(x0) + 1.093 cos(x1) + 0.962 sin(x0) + 2.003 sin(x1) + -0.266 x0_dot + -0.109 x1_dot + -0.274 x0x0_dot + 0.151 x0x0x0_dot + -0.293 x1x1x0_dot + 0.019 x0x1x0_dot + 0.274 cos(x0)x0_dot + 0.069 cos(x1)x0_dot + 0.294 sin(x0)x0_dot + 0.986 sin(x1)x0_dot + 0.248 x0x1_dot + -0.435 x1x1_dot + -0.018 x0x0x1_dot + -0.118 x1x1x1_dot + 0.049 x0x1x1_dot + 0.237 cos(x0)x1_dot + -0.010 cos(x1)x1_dot + -0.083 sin(x0)x1_dot + 0.478 sin(x1)x1_dot
x0x0x0_dot = 2.271 1 + 2.355 x0 + 10.378 x1 + -0.417 x0x0 + 2.791 x1x1 + 0.512 x0x1 + 0.445 cos(x0) + -4.895 cos(x1) + -1.344 sin(x0) + -7.396 sin(x1) + 0.793 x0_dot + 0.093 x1_dot + 2.505 x0x0_dot + 3.101 x1x0_dot + 0.797 x1x1x0_dot + -0.221 x0x1x0_dot + -0.548 cos(x0)x0_dot + -0.167 cos(x1)x0_dot + -2.069 sin(x0)x0_dot + -2.973 sin(x1)x0_dot + 0.483 x0x1_dot + 1.060 x1x1_dot + -0.311 x0x0x1_dot + 0.204 x1x1x1_dot + -0.297 x0x1x1_dot + -0.162 cos(x0)x1_dot + 0.172 cos(x1)x1_dot + -0.528 sin(x0)x1_dot + -1.281 sin(x1)x1_dot
x1x1x0_dot = -0.962 1 + -4.513 x0 + -7.715 x1 + 0.969 x0x0 + -2.340 x1x1 + -0.585 x0x1 + -2.647 cos(x0) + 3.500 cos(x1) + 2.816 sin(x0) + 6.656 sin(x1) + -0.835 x0_dot + -0.283 x1_dot + -0.658 x0x0_dot + -3.177 x1x0_dot + 0.420 x0x0x0_dot + -0.007 x0x1x0_dot + 0.881 cos(x0)x0_dot + 0.148 cos(x1)x0_dot + 0.775 sin(x0)x0_dot + 3.333 sin(x1)x0_dot + 0.803 x0x1_dot + -1.381 x1x1_dot + -0.069 x0x0x1_dot + -0.416 x1x1x1_dot + 0.128 x0x1x1_dot + 0.677 cos(x0)x1_dot + -0.066 cos(x1)x1_dot + -0.280 sin(x0)x1_dot + 1.630 sin(x1)x1_dot
x0x1x0_dot = 1.647 1 + 10.564 x0 + 17.030 x1 + -1.984 x0x0 + 4.999 x1x1 + 1.533 x0x1 + 0.108 cos(x0) + -5.027 cos(x1) + -6.262 sin(x0) + -8.882 sin(x1) + 0.295 x0_dot + 0.598 x1_dot + 2.016 x0x0_dot + 1.786 x1x0_dot + -1.009 x0x0x0_dot + -0.056 x1x1x0_dot + -0.830 cos(x0)x0_dot + 0.597 cos(x1)x0_dot + -1.635 sin(x0)x0_dot + -1.409 sin(x1)x0_dot + -0.758 x0x1_dot + -0.657 x1x1_dot + -0.121 x0x0x1_dot + -0.688 x1x1x1_dot + -0.741 x0x1x1_dot + -1.270 cos(x0)x1_dot + 0.955 cos(x1)x1_dot + 0.666 sin(x0)x1_dot + 0.135 sin(x1)x1_dot
cos(x0)x0_dot = 0.463 1 + 7.055 x0 + 7.341 x1 + -1.649 x0x0 + 2.029 x1x1 + 0.333 x0x1 + 3.168 cos(x0) + -2.912 cos(x1) + -3.877 sin(x0) + -5.413 sin(x1) + 0.775 x0_dot + 0.493 x1_dot + -0.120 x0x0_dot + 1.950 x1x0_dot + -0.190 x0x0x0_dot + 0.580 x1x1x0_dot + -0.063 x0x1x0_dot + -0.058 cos(x1)x0_dot + -0.330 sin(x0)x0_dot + -2.160 sin(x1)x0_dot + -1.331 x0x1_dot + 0.480 x1x1_dot + 0.191 x0x0x1_dot + 0.123 x1x1x1_dot + -0.125 x0x1x1_dot + -1.005 cos(x0)x1_dot + 0.108 cos(x1)x1_dot + 0.482 sin(x0)x1_dot + -0.878 sin(x1)x1_dot
cos(x1)x0_dot = -0.358 1 + 1.429 x0 + -2.751 x1 + -0.774 x0x0 + -1.330 x1x1 + -1.017 x0x1 + 1.287 cos(x0) + 0.385 cos(x1) + -0.100 sin(x0) + 2.400 sin(x1) + 0.580 x0_dot + 0.358 x1_dot + 0.761 x0x0_dot + 1.186 x1x0_dot + -0.137 x0x0x0_dot + 0.232 x1x1x0_dot + 0.108 x0x1x0_dot + -0.140 cos(x0)x0_dot + -0.761 sin(x0)x0_dot + -0.112 sin(x1)x0_dot + -0.096 x0x1_dot + 1.286 x1x1_dot + 0.050 x0x0x1_dot + 0.381 x1x1x1_dot + 0.136 x0x1x1_dot + -0.342 cos(x0)x1_dot + -0.762 cos(x1)x1_dot + -0.348 sin(x0)x1_dot + -0.425 sin(x1)x1_dot
sin(x0)x0_dot = 0.910 1 + 0.925 x0 + 3.813 x1 + -0.246 x0x0 + 0.875 x1x1 + -0.028 x0x1 + 0.188 cos(x0) + -1.910 cos(x1) + -0.320 sin(x0) + -2.518 sin(x1) + 0.370 x0_dot + 0.058 x1_dot + 1.182 x0x0_dot + 1.277 x1x0_dot + -0.437 x0x0x0_dot + 0.311 x1x1x0_dot + -0.076 x0x1x0_dot + -0.201 cos(x0)x0_dot + -0.194 cos(x1)x0_dot + -1.077 sin(x1)x0_dot + 0.274 x0x1_dot + 0.499 x1x1_dot + -0.142 x0x0x1_dot + 0.109 x1x1x1_dot + -0.097 x0x1x1_dot + -0.058 cos(x0)x1_dot + -0.029 cos(x1)x1_dot + -0.351 sin(x0)x1_dot + -0.489 sin(x1)x1_dot
sin(x1)x0_dot = 0.349 1 + 1.499 x0 + 2.692 x1 + -0.307 x0x0 + 0.813 x1x1 + 0.217 x0x1 + 0.778 cos(x0) + -1.176 cos(x1) + -0.933 sin(x0) + -2.219 sin(x1) + 0.247 x0_dot + 0.087 x1_dot + 0.186 x0x0_dot + 0.908 x1x0_dot + -0.133 x0x0x0_dot + 0.283 x1x1x0_dot + -0.014 x0x1x0_dot + -0.279 cos(x0)x0_dot + -0.006 cos(x1)x0_dot + -0.228 sin(x0)x0_dot + -0.252 x0x1_dot + 0.330 x1x1_dot + 0.016 x0x0x1_dot + 0.094 x1x1x1_dot + -0.053 x0x1x1_dot + -0.212 cos(x0)x1_dot + 0.057 cos(x1)x1_dot + 0.094 sin(x0)x1_dot + -0.457 sin(x1)x1_dot
x0x1_dot = -0.229 1 + 4.145 x0 + 2.601 x1 + -1.005 x0x0 + 0.743 x1x1 + 0.106 x0x1 + 1.836 cos(x0) + -0.769 cos(x1) + -2.285 sin(x0) + -1.836 sin(x1) + 0.317 x0_dot + 0.309 x1_dot + -0.518 x0x0_dot + 0.688 x1x0_dot + 0.065 x0x0x0_dot + 0.206 x1x1x0_dot + -0.022 x0x1x0_dot + -0.518 cos(x0)x0_dot + -0.016 cos(x1)x0_dot + 0.175 sin(x0)x0_dot + -0.758 sin(x1)x0_dot + 0.159 x1x1_dot + 0.200 x0x0x1_dot + 0.043 x1x1x1_dot + -0.029 x0x1x1_dot + -0.648 cos(x0)x1_dot + 0.032 cos(x1)x1_dot + 0.476 sin(x0)x1_dot + -0.309 sin(x1)x1_dot
x1x1_dot = -0.104 1 + -0.688 x0 + -0.937 x1 + 0.163 x0x0 + -0.376 x1x1 + -0.139 x0x1 + -0.799 cos(x0) + 0.647 cos(x1) + 0.543 sin(x0) + 1.221 sin(x1) + -0.298 x0_dot + -0.090 x1_dot + -0.454 x0x0_dot + -1.419 x1x0_dot + 0.167 x0x0x0_dot + -0.413 x1x1x0_dot + -0.023 x0x1x0_dot + 0.218 cos(x0)x0_dot + 0.246 cos(x1)x0_dot + 0.373 sin(x0)x0_dot + 1.161 sin(x1)x0_dot + 0.184 x0x1_dot + -0.031 x0x0x1_dot + -0.290 x1x1x1_dot + 0.014 x0x1x1_dot + 0.211 cos(x0)x1_dot + 0.139 cos(x1)x1_dot + -0.094 sin(x0)x1_dot + 0.758 sin(x1)x1_dot
x0x0x1_dot = 2.719 1 + -13.624 x0 + -1.371 x1 + 3.433 x0x0 + -0.623 x1x1 + -0.065 x0x1 + -6.624 cos(x0) + -0.933 cos(x1) + 7.583 sin(x0) + 1.050 sin(x1) + -0.705 x0_dot + -1.132 x1_dot + 3.322 x0x0_dot + -1.066 x1x0_dot + -0.862 x0x0x0_dot + -0.366 x1x1x0_dot + -0.074 x0x1x0_dot + 1.540 cos(x0)x0_dot + 0.169 cos(x1)x0_dot + -1.869 sin(x0)x0_dot + 1.022 sin(x1)x0_dot + 4.124 x0x1_dot + -0.549 x1x1_dot + -0.205 x1x1x1_dot + -0.117 x0x1x1_dot + 2.395 cos(x0)x1_dot + 0.161 cos(x1)x1_dot + -2.244 sin(x0)x1_dot + 0.578 sin(x1)x1_dot
x1x1x1_dot = -0.246 1 + -0.353 x0 + -0.984 x1 + 0.216 x0x0 + -0.471 x1x1 + -0.036 x0x1 + -2.435 cos(x0) + 1.471 cos(x1) + 0.458 sin(x0) + 2.864 sin(x1) + -0.872 x0_dot + -0.122 x1_dot + -0.961 x0x0_dot + -4.045 x1x0_dot + 0.339 x0x0x0_dot + -1.308 x1x1x0_dot + -0.251 x0x1x0_dot + 0.587 cos(x0)x0_dot + 0.765 cos(x1)x0_dot + 0.857 sin(x0)x0_dot + 3.482 sin(x1)x0_dot + 0.531 x0x1_dot + -3.046 x1x1_dot + -0.122 x0x0x1_dot + -0.084 x0x1x1_dot + 0.427 cos(x0)x1_dot + 0.507 cos(x1)x1_dot + -0.156 sin(x0)x1_dot + 2.399 sin(x1)x1_dot
x0x1x1_dot = 4.275 1 + 13.442 x0 + 29.906 x1 + -2.153 x0x0 + 9.167 x1x1 + 3.111 x0x1 + 3.155 cos(x0) + -11.694 cos(x1) + -8.631 sin(x0) + -21.081 sin(x1) + 1.437 x0_dot + 0.648 x1_dot + 2.817 x0x0_dot + 5.690 x1x0_dot + -1.666 x0x0x0_dot + 1.373 x1x1x0_dot + -0.908 x0x1x0_dot + -2.026 cos(x0)x0_dot + 0.923 cos(x1)x0_dot + -2.572 sin(x0)x0_dot + -6.644 sin(x1)x0_dot + -1.207 x0x1_dot + 0.502 x1x1_dot + -0.237 x0x0x1_dot + -0.279 x1x1x1_dot + -1.609 cos(x0)x1_dot + 1.459 cos(x1)x1_dot + 0.744 sin(x0)x1_dot + -2.166 sin(x1)x1_dot
cos(x0)x1_dot = -0.155 1 + 6.748 x0 + 4.842 x1 + -1.620 x0x0 + 1.344 x1x1 + 0.197 x0x1 + 2.807 cos(x0) + -1.610 cos(x1) + -3.691 sin(x0) + -3.263 sin(x1) + 0.569 x0_dot + 0.511 x1_dot + -0.353 x0x0_dot + 1.354 x1x0_dot + -0.045 x0x0x0_dot + 0.358 x1x1x0_dot + -0.077 x0x1x0_dot + -0.806 cos(x0)x0_dot + -0.115 cos(x1)x0_dot + -0.076 sin(x0)x0_dot + -1.316 sin(x1)x0_dot + -1.335 x0x1_dot + 0.373 x1x1_dot + 0.239 x0x0x1_dot + 0.072 x1x1x1_dot + -0.080 x0x1x1_dot + 0.019 cos(x1)x1_dot + 0.569 sin(x0)x1_dot + -0.528 sin(x1)x1_dot
cos(x1)x1_dot = -1.170 1 + -1.851 x0 + -8.996 x1 + -0.178 x0x0 + -3.173 x1x1 + -1.559 x0x1 + 0.161 cos(x0) + 2.932 cos(x1) + 1.764 sin(x0) + 6.831 sin(x1) + 0.152 x0_dot + 0.183 x1_dot + 0.199 x0x0_dot + -0.238 x1x0_dot + 0.202 x0x0x0_dot + -0.148 x1x1x0_dot + 0.243 x0x1x0_dot + 0.364 cos(x0)x0_dot + -1.069 cos(x1)x0_dot + -0.162 sin(x0)x0_dot + 1.481 sin(x1)x0_dot + 0.282 x0x1_dot + 1.012 x1x1_dot + 0.067 x0x0x1_dot + 0.353 x1x1x1_dot + 0.303 x0x1x1_dot + 0.079 cos(x0)x1_dot + -0.467 sin(x0)x1_dot + 0.179 sin(x1)x1_dot
sin(x0)x1_dot = 0.721 1 + -4.760 x0 + -2.140 x1 + 0.989 x0x0 + -1.029 x1x1 + -0.633 x0x1 + -2.022 cos(x0) + 0.186 cos(x1) + 3.185 sin(x0) + 1.880 sin(x1) + -0.177 x0_dot + -0.348 x1_dot + 1.029 x0x0_dot + -0.691 x1x0_dot + -0.210 x0x0x0_dot + -0.214 x1x1x0_dot + 0.058 x0x1x0_dot + 0.558 cos(x0)x0_dot + -0.168 cos(x1)x0_dot + -0.666 sin(x0)x0_dot + 0.847 sin(x1)x0_dot + 1.416 x0x1_dot + -0.240 x1x1_dot + -0.324 x0x0x1_dot + -0.038 x1x1x1_dot + 0.053 x0x1x1_dot + 0.822 cos(x0)x1_dot + -0.161 cos(x1)x1_dot + 0.376 sin(x1)x1_dot
sin(x1)x1_dot = 0.559 1 + 2.091 x0 + 4.025 x1 + -0.429 x0x0 + 1.262 x1x1 + 0.353 x0x1 + 1.392 cos(x0) + -1.896 cos(x1) + -1.370 sin(x0) + -3.608 sin(x1) + 0.464 x0_dot + 0.131 x1_dot + 0.401 x0x0_dot + 1.854 x1x0_dot + -0.241 x0x0x0_dot + 0.581 x1x1x0_dot + 0.005 x0x1x0_dot + -0.476 cos(x0)x0_dot + -0.096 cos(x1)x0_dot + -0.435 sin(x0)x0_dot + -1.919 sin(x1)x0_dot + -0.431 x0x1_dot + 0.902 x1x1_dot + 0.039 x0x0x1_dot + 0.271 x1x1x1_dot + -0.073 x0x1x1_dot + -0.357 cos(x0)x1_dot + 0.029 cos(x1)x1_dot + 0.176 sin(x0)x1_dot
['1', 'x0', 'x1', 'x0x0', 'x1x1', 'x0x1', 'cos(x0)', 'cos(x1)', 'sin(x0)', 'sin(x1)', 'x0_dot', 'x1_dot', 'x0x0_dot', 'x1x0_dot', 'x0x0x0_dot', 'x1x1x0_dot', 'x0x1x0_dot', 'cos(x0)x0_dot', 'cos(x1)x0_dot', 'sin(x0)x0_dot', 'sin(x1)x0_dot', 'x0x1_dot', 'x1x1_dot', 'x0x0x1_dot', 'x1x1x1_dot', 'x0x1x1_dot', 'cos(x0)x1_dot', 'cos(x1)x1_dot', 'sin(x0)x1_dot', 'sin(x1)x1_dot']

How can I get a model similar to the original one? Is this library function choosing problem?

Any help would be highly appreciated.

Thank you in advance, Anton.

The code:

# Import libraries.
import numpy as np
import pysindy as ps
from scipy.integrate import solve_ivp

def two_d_system(t, x, a10=1, a11=2, a12=3, a20=0, a22=-3, b22=0.0125, v=0.992, e1=1, e2=-1):
    return [
        (a10 + a11*x[0] + a12*x[1] + b22*x[1]*x[1])/(1 - v*np.cos(x[0] - e1)),
        (a20 - a12*x[0] + a22*x[1] - b22*x[0]*x[1])/(1 - v*np.cos(x[0] - e2))
    ]

# define parameters
dt = 0.2
T = 25
t = np.arange(0, T + dt, dt)
t_len_half = int(len(t)/2)
t_span = (t[0], t[-1])
x0 = [1, 1]

integrator_keywords = {'rtol': 1e-12, 'method': 'RK45', 'atol': 1e-12}
x_integral = solve_ivp(two_d_system, t_span, x0, t_eval=t, **integrator_keywords).y.T

# Initialize custom SINDy library so that we can have x_dot inside it.
library_functions = [
    lambda x: x,
    lambda x: x ** 2,
    lambda x, y: x * y,
    lambda x: np.cos(x),
    lambda x: np.sin(x)
]
x_dot_library_functions = [
    lambda x: x
]

# library function names includes both
# the x_library_functions and x_dot_library_functions names
library_function_names = [
    lambda x: x,
    lambda x: x + x,
    lambda x, y: x + y,
    lambda x: "cos(" + x + ")",
    lambda x: "sin(" + x + ")",
    lambda x: x
]

# Need to pass time base to the library so can build the x_dot library from x
sindy_library = ps.SINDyPILibrary(
    library_functions=library_functions,
    x_dot_library_functions=x_dot_library_functions,
    t=t,
    function_names=library_function_names,
    include_bias=True
)

sindy_opt = ps.SINDyPI(
    threshold=1e-8,
    tol=1e-5
)

model = ps.SINDy(
    optimizer=sindy_opt,
    feature_library=sindy_library,
    differentiation_method=ps.FiniteDifference(drop_endpoints=True),
)

model.fit(x_integral, t=t)
model.print()
predicted_models = model.predict(x_integral)
x_derivative = model.differentiate(x_integral, t=dt)

import matplotlib.pyplot as plt

plt.plot(t, [i[10] for i in predicted_models], "r", label="model derivative X'")
plt.plot(t, [i[0] for i in x_derivative], "b--", label="system derivative X'")
plt.plot(t, [i[2] for i in predicted_models], "g", label="model X")
plt.plot(t, [i[1] for i in x_integral], "y--", label="system X")

print(model.get_feature_names())

plt.xlabel('t')
plt.title('2d System')
plt.show()

Python version: 3.11, PYSINDY version: 1.7.3

antono0106 commented 6 months ago

@Jacob-Stevens-Haas sorry for disturbing, could you please help me to see what’s wrong with my code in order to resolve the issue? Thank you.

Jacob-Stevens-Haas commented 6 months ago

Hey @antono0106, I'd love to. I'm going to be spending a bit less time on github over the holidays, however, and SINDy-PI is the part of the codebase I'm least familiar with. So I'm going to ask a bit more rather than diving fully in: 1) Can you get SINDy-PI to work with your code, but on a simpler system? E.g. with $\epsilon=0$, or fewer terms? 2) did you mean to plot x1 equation as model X and x0_dot as model_derivative_X'? Likewise, looks like you swapped x0 and x1 in your system and system derivative 3) plt.legend() and use a color other than yellow so I don't have to scroll between the plot and the code to read the plot. 4) You have models with the correct terms, they just have too many other terms. Increase your optimizer threshold. There's no great way to "jump" to the correct model in SINDy-PI AFAIK.

antono0106 commented 6 months ago

Hey again @Jacob-Stevens-Haas , thanks for the answer and sorry for bothering you before Christmas.

  1. Yes, I tried to do this. Even tried to remove a denominator, but no success here.
  2. Ah, I see. Swapped, you're right. Anyway, plots are not the issue =/
  3. Thx, agree
  4. Tried with different threshold and tol. Even tried to swap SINDyPILibrary on PDELibrary, but no success here too.

I think that in case when there is no "jump" ability using this library, such a way is not working for me.

Thank you again! Have a good holidays! May all your days be merry and bright this season.