For industrial PID proposal, we are thinking derivativeFilterLoss and antiwindupFreq.
Some research is done in a separate repository at https://github.com/andreika-git/autopid
Keywords:
https://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm
Code: Select all
C:\stuff\autopid.rusefi\examples\2003_mazda_miata_alternator>..\..\pid_from_msl.exe "miata_alt_log.msl" 66.737 71.662 54 10 13.8
PID_FROM_MSL - find PID controller coefficients based on a measured step response in a rusEFI log file.
Version 0.3 (c) andreika, 2019
Reading file miata_alt_log.msl...
Project Settings: FLT_EVAL_METHOD=0 sizeof(float_t)=8 sizeof(double_t)=8
Measuring Settings: targetValue=13.8 minValue=20 maxValue=30 stepPoint=178 maxPoint=449 numPoints=462 timeScale=91.1675
1) Trying method AUTO1 on "Regulator" PID model:
* modelBias=7.88118 avgMin=13.4117 avgMax=16.1769
* Params0: K=0.276525 T1=0.440947 T2=0 L=0.285518
* Solving...
[0] (0.276313,0.598212,0.234637,0) l=0.001 merit 34.0112->27.4315, dm=-6.57969
[1] (0.276887,0.664806,0.191864,0) l=0.0001 merit 27.4315->26.6702, dm=-0.761283
[2] (0.276883,0.684747,0.171325,0) l=1e-05 merit 26.6702->26.4857, dm=-0.18457
[3] (0.276877,0.698491,0.156908,0) l=1e-06 merit 26.4857->26.4043, dm=-0.0813515
[4] (0.276871,0.705527,0.149414,0) l=1e-07 merit 26.4043->26.3831, dm=-0.0212164
[96] (0.276862,0.708473,0.145976,0) l=1e-11 merit 26.3801->26.3801, dm=2.4869e-14
[97] (0.276862,0.708473,0.145976,0) l=1e-10 merit 26.3801->26.3801, dm=3.44613e-13
[98] (0.276862,0.708473,0.145976,0) l=1e-11 merit 26.3801->26.3801, dm=-3.2685e-13
[99] (0.276862,0.708473,0.145976,0) l=1e-12 merit 26.3801->26.3801, dm=-4.51195e-13
* The solver finished in 100 iterations! (Merit: 34.0112 -> 26.3801)
* Solving for better coefs:
* The solver aborted after 0 iterations! (Merit: 2783.17 -> 2783.17)
2) Trying method AUTO2 on "Regulator" PID model:
* modelBias=7.88118 avgMin=13.4117 avgMax=16.1769
* Params0: K=0.276525 T1=5.06304 T2=0.246866 L=-0.968021
* Solving...
[0] (0.2776,1.99779,0.1,0.01) l=0.001 merit 704.978->191.579, dm=-513.399
[1] (0.275877,0.53173,0.1,0.105225) l=0.0001 merit 191.579->27.8961, dm=-163.683
[2] (0.275877,0.53173,0.1,0.105225) l=0.001 merit 27.8961->48.379, dm=20.483
[3] (0.276545,0.513536,0.1,0.0688601) l=0.0001 merit 48.379->33.1391, dm=-15.2399
[4] (0.276545,0.513536,0.1,0.0688601) l=0.001 merit 33.1391->51.093, dm=17.9539
[5] (0.27759,0.884054,0.1,0.01) l=0.0001 merit 51.093->29.9555, dm=-21.1375
[6] (0.27759,0.884054,0.1,0.01) l=0.001 merit 29.9555->319.579, dm=289.624
...
[97] (0.276477,0.663123,0.1,0.0921907) l=0.01 merit 26.7273->26.0569, dm=-0.670377
[98] (0.276477,0.663123,0.1,0.0921907) l=0.1 merit 26.0569->39.1889, dm=13.1319
[99] (0.276638,0.643867,0.1,0.0330709) l=0.01 merit 39.1889->27.3687, dm=-11.8202
* The solver finished in 100 iterations! (Merit: 704.978 -> 27.3687)
* Solving for better coefs:
[0] (19.1186,27.5346,0.588119,0.0194127) l=1 merit 266.429->252.835, dm=-13.5936
[1] (16.5605,19.5184,0.377857,0.0194127) l=0.1 merit 252.835->185.372, dm=-67.4635
[2] (13.5241,12.8894,0.0185283,0.0194127) l=0.01 merit 185.372->134.617, dm=-50.7552
[3] (12.9896,19.017,0.567793,0.0194127) l=0.001 merit 134.617->134.409, dm=-0.207611
[4] (10.8851,12.9655,-0.356962,0.0194127) l=0.0001 merit 134.409->117.901, dm=-16.5077
[5] (10.8851,12.9655,-0.356962,0.0194127) l=0.001 merit 117.901->119.807, dm=1.90552
[6] (10.8851,12.9655,-0.356962,0.0194127) l=0.01 merit 117.901->118.346, dm=0.445136
[7] (10.8851,12.9655,-0.356962,0.0194127) l=0.1 merit 117.901->120.412, dm=2.51062
[8] (11.4456,16.8133,0.122291,0.0194127) l=0.01 merit 117.901->117.269, dm=-0.632365
[9] (11.4456,16.8133,0.122291,0.0194127) l=0.1 merit 117.269->138.488, dm=21.2192
[10] (11.4456,16.8133,0.122291,0.0194127) l=1 merit 117.269->126.189, dm=8.92042
[11] (11.4422,17.299,0.358441,0.0194127) l=0.1 merit 117.269->117.063, dm=-0.206191
[12] (11.4422,17.299,0.358441,0.0194127) l=1 merit 117.063->119.914, dm=2.85096
[13] (11.4422,17.299,0.358441,0.0194127) l=10 merit 117.063->121.764, dm=4.70095
[14] (11.4422,17.299,0.358441,0.0194127) l=100 merit 117.063->117.584, dm=0.521006
[15] (11.4422,17.299,0.358441,0.0194127) l=1000 merit 117.063->117.089, dm=0.0257627
[16] (11.4422,17.299,0.358441,0.0194127) l=10000 merit 117.063->117.066, dm=0.00360832
[17] (11.4422,17.299,0.358441,0.0194127) l=100000 merit 117.063->117.063, dm=0.000368467
[18] (11.4422,17.299,0.358441,0.0194127) l=1e+06 merit 117.063->117.063, dm=3.69496e-05
[19] (11.4422,17.299,0.358441,0.0194127) l=1e+07 merit 117.063->117.063, dm=3.69601e-06
[20] (11.4422,17.299,0.358441,0.0194127) l=1e+08 merit 117.063->117.063, dm=3.69611e-07
[21] (11.4422,17.299,0.358441,0.0194127) l=1e+09 merit 117.063->117.063, dm=3.69611e-08
* The solver finished in 22 iterations! (Merit: 266.429 -> 117.063)
Done!
Model-1 Params: K=0.276862 T1=0.708473 T2=0 L=0.145976
PID0: P=25.78098074 I=32.99071470 D=1.70595759 offset=21.00000000 period=11.00000000ms
Metric0 result: 2783.17 ITAE=2783.17 ISE=26945.9 Overshoot=0%
PID1: P=25.78098074 I=32.99071470 D=1.70595759 offset=21.00000000 period=11.00000000ms
Metric1 result: 2783.17 ITAE=2783.17 ISE=26945.9 Overshoot=0%
Model-2 Params: K=0.276638 T1=0.643867 T2=0.0330709 L=0.1
PID0: P=19.57612646 I=28.91866148 D=0.61577173 offset=21.00000000 period=11.00000000ms
Metric0 result: 266.429 ITAE=138.854 ISE=180.596 Overshoot=11.2949%
PID1: P=11.44222099 I=17.29904723 D=0.35844114 offset=21.00000000 period=11.00000000ms
Metric1 result: 117.063 ITAE=109.151 ISE=155.763 Overshoot=2.81278%
The best PID: P=11.44222099 I=17.29904723 D=0.35844114 offset=21.0 period=11.0ms