как-то была задача сделать терморегулятор для промоборудования, где
питание колбасило так, что иногда станки вставали по ошибкам (была
кинута хилая воздушка, и куча станков в работе :)) ПРишлось
сколхозить интегрально-нелинейный алгоритм регулирования. Суть в
том что наблюдаем тренд изменения температуры, исходя из него вычисляем коэффициент приращения для алгоритма регулирования, начинаем цикл пропорционального регулирования. Как только видим изменение температуры - прекращаем регулирующее воздействие, и ждём устаканивания процесса. Потом, опять сравниваем с уставкой и идём на новый пропорциональный цикл. Коэффициент регулирования - высчитывается из разницы уставки и фактической температуры с поправкой на производную её изменения (тренд).
в итоге, график выхода на уставку был примерно такого вида:
Все возмущающие факторы (и температурные, и питание, и прочее, - стали пофиг :)) но скорость выхода на уставку в 2-3 раза дольше, чем ПИД. Можно играться коэффициентами и с небольшим перерегулированием (процентов в 10) получить почти то же время, что даёт ПИД. В последующем чуть усложнил, добавив предсказывание по производной и её изменении во времени, получилось побыстрее.
P.S. ПИД регуляторы не проканали, как меняются внешние условия и опять надо подбирать коэффициенты :(( а там питание так скакало, что "мама не горюй! " :((
в общем, представляем себя на месте регулятора: - чуть подкрутили регулировку - смотрим на резалт, пока не "устаканится", потом опять "подкручиваем" (а величина "подкрутки" вычисляется динамически из ошибки и темпеатурных трендов)... и так, пока не достигнем уставки, медленно, но верно :)
В общем, если возмущающие факторы скоротечны и периодические, то такой алгоритм всё сглаживает. В качестве хорошей и быстрой следящей системы , чтобы максимально оперативно адаптироваться к измененям, - малопригоден, т.к. довольно медленный. Коэффициентами можно настроить, чтобы был шустрый, но будет почти что ПИД :) который в общем является "быстрым следящим" алгоритмом, а этот - с нулевой ошибкой регулирования (интегральный) и достаточно "ленивый", но хорошо адаптируется к разным постоянным времени системы и неплохо работает при сильно (но не очень быстро) меняющихся "вводных" (т.е. не очень хорошо отрабатывает "динамику")
а вообще давно дело было, много чего позабыл (надоть как будет время поднять тему (там были мысли как замутить адаптивный самонастраиваемый алгоритм :))