[uquote="Lum1noFor",url="/forum/viewtopic.php?p=4231141#p4231141"]почему Вы говорите, что можно просто взять и убрать dt. Если есть время и возможность - объясните, пожалуйста![/uquote]Ув.
Ivanoff-iv уже объяснил. Вкратце, если переписать вычисление интегральной как я советовал, то будет:
Integral += error * dt * Ki;
где: dt * Ki - const. А зачем многократно вычислять одно и то же, если его можно вычислить только один раз - при настройке Ki? А если учесть, что само значение Ki - это просто безразмерный коэффициент, не имеющий физического выражения (в метрах/кг/etc.) и Вы его просто подбираете каким-то методом, то просто отбрасывайте dt из формулы и подбирайте Ki.
[uquote="Lum1noFor",url="/forum/viewtopic.php?p=4231141#p4231141"]
Во-вторых: Здесь интегральную составляющую лучше считать так:
Integral += error * Ki;
Далее - ограничение. Это и будет I.
А почему именно так? Из соображений производительности, или есть какие-то другие причины? Почему не "в лоб", вот так:
Код: Выделить всё
Integral += error * dt;
if (Integral > max/Ki) {
Integral = max/Ki;
} else if (Integral < -max/Ki) {
Integral = -max/Ki;
}
I = Ki*Integral;
[/uquote]
Ну во-первых: значительно меньше вычислений. Сами сравните.
Во-вторых: в этом Вашем коде - представьте, что система регулирования в каком-то режиме не может обеспечить минимизацию error. Например - из-за ограничений интегральной составляющей. Тогда ошибка будет всегда присутствовать. Integral будет расти и расти постоянно со знаком направленным в сторону error. И в конце-концов всё равно произойдёт или переполнение Integral (float тоже не бесконечен). Или потеря точности (тогда содержимое Integral дорастёт до такого уровня, что оно перестанет реагировать на изменение входного error, так как величина error будет меньше веса минимального разряда Integral) и интегральная составляющая вашего ПИД-регулятора навечно защёлкнется в фиксированном положении. Это как раз тот момент, о котором я говорил:
[uquote="jcxz",url="/forum/viewtopic.php?p=4231125#p4231125"]И к тому же - в плавающей точке приколов тоже не меньше. И переполнения там имеются, и всякие особые значения (денормированные, "нечисла", +-бесконечности). Только начинающие о них никогда не задумываются.[/uquote]
Но даже если переполнения или потери точности не произойдёт, то в вашем методе ограничения Integral, будет присутствовать значительный гистерезис. Например долго стояла положительная ошибка, Integral выросло (например стало == +1e6), но ограничение стоит например == +100. А потом error стало отрицательным, но небольшим по величине. И теперь пока оно не выберет весь этот накопленный +1e6, на входе у вас будет стоять максимальное положительное значение == +100.