Ручная настройка и компромиссы коэффициентов

Как подобрать Kp, Ki, Kd: ручной метод и эксперименты на симуляции.

Настройка (tuning) ПИД — это подбор трёх коэффициентов под конкретный объект так, чтобы получить быстрый, точный и устойчивый отклик.

Зачем нужна настройка

Один и тот же ПИД с одними коэффициентами отлично управляет печью и разваливается на дроне — потому что у объектов разная динамика. Коэффициенты $K_p$, $K_i$, $K_d$ нужно подбирать под объект. Плохая настройка — самая частая причина проблем на практике: система либо вялая, либо раскачивается, либо дико перерегулирует. Хорошая новость: есть проверенные стратегии, которые приводят к рабочей настройке за разумное число попыток.

Ручная настройка: пошаговый рецепт

Самый понятный подход — настраивать составляющие по очереди, наблюдая за откликом:

  1. Обнулите I и D. Увеличивайте $K_p$, пока система не станет достаточно быстрой, но ещё без сильных колебаний. Останется небольшая остаточная ошибка — это нормально.
  2. Добавьте I. Понемногу увеличивайте $K_i$, пока остаточная ошибка не исчезнет. Слишком большой $K_i$ добавит перерегулирование и колебания — отступите.
  3. Добавьте D. Увеличивайте $K_d$, чтобы погасить перерегулирование и колебания. Слишком большой $K_d$ сделает систему нервной к шуму — отступите.

Как работает под капотом: эксперимент с коэффициентами

Прогоним один объект с разными настройками и посмотрим на показатели. Это и есть «настройка на симуляции» — то, чем инженеры занимаются часами перед выкатом на железо.

def run(Kp, Ki, Kd):
    m, b, kc, dt = 1.0, 0.3, 4.0, 0.05
    sp, x, v = 1.0, 0.0, 0.0
    integral, prev = 0.0, sp
    peak, ys = 0.0, []
    for _ in range(600):
        e = sp - x
        integral += e*dt
        d = (e - prev)/dt; prev = e
        F = Kp*e + Ki*integral + Kd*d
        a = (F - b*v - kc*x)/m
        v += a*dt; x += v*dt
        ys.append(x); peak = max(peak, x)
    # время установления (коридор 2%)
    settle = 0.0
    for i in range(len(ys)-1, -1, -1):
        if abs(ys[i]-sp) > 0.02:
            settle = (i+1)*dt; break
    return (peak-1)*100, settle, sp-ys[-1]

print("настройка        перерег%  t_settle  стат.ошибка")
for name,(Kp,Ki,Kd) in [("только P    ",(6,0,0)),
                        ("PI          ",(6,2,0)),
                        ("PID мягкий  ",(6,2,3)),
                        ("PID жёсткий ",(12,2,3))]:
    o,s,e = run(Kp,Ki,Kd)
    print(f"{name}    {o:6.1f}   {s:6.2f}    {e:8.4f}")

Вывод:

настройка        перерег%  t_settle  стат.ошибка
только P          11.8    30.00      0.4035
PI                32.5    30.00      0.0442
PID мягкий        -0.1    13.80      0.0006
PID жёсткий       -0.5    19.25      0.0051

Таблица наглядно показывает компромиссы: чистый P оставляет ошибку, PI её убирает ценой перерегулирования, D гасит перерегулирование, а рост $K_p$ ускоряет, но снова добавляет раскачки. Настройка — это поиск точки баланса в этом пространстве под требования задачи.

Компромиссы быстродействие/устойчивость/перерегулирование

Запомните три тяги, которые конкурируют. Быстродействие требует большого $K_p$. Устойчивость требует не задирать $K_p$ и добавить $K_d$. Точность (ноль ошибки) требует $K_i$, но он же добавляет перерегулирование. Нельзя выкрутить всё на максимум — приходится выбирать. Для лифта приоритет — ноль перерегулирования; для дрона — скорость; для термостата — точность и спокойствие.

Влияние каждого коэффициента: памятка

Полезно держать в голове сводную таблицу эффектов, которую инженеры называют «эвристикой ПИД». Увеличение $K_p$: быстрее реакция, меньше статическая ошибка, но больше перерегулирование и ближе к неустойчивости. Увеличение $K_i$: устраняет статическую ошибку, но замедляет, добавляет перерегулирование и колебания. Увеличение $K_d$: гасит перерегулирование и улучшает устойчивость, но усиливает шум и при избытке тормозит реакцию. Важная оговорка: эти правила приблизительны и взаимозависимы — коэффициенты влияют друг на друга, и изменение одного может потребовать пересмотра остальных. Поэтому настройка — это итеративный танец, а не однократная подстановка; таблица задаёт направление, а финальные значения находятся экспериментом.

Частые ошибки

  • Крутить все три коэффициента одновременно. Невозможно понять, что на что влияет. Меняйте по одному.
  • Настраивать «на глаз» без метрик. Считайте перерегулирование и время установления численно — глаз обманывает.
  • Настроить на одном режиме. Объект может вести себя иначе при другой нагрузке; проверяйте на разных уставках и возмущениях.

Итоги

  • Настройка — подбор $K_p$, $K_i$, $K_d$ под динамику конкретного объекта.
  • Ручной рецепт: сначала $K_p$ (скорость), потом $K_i$ (убрать ошибку), потом $K_d$ (погасить раскачку).
  • Быстродействие, устойчивость и точность конкурируют — настройка всегда компромисс.
Проверьте себя
1. В каком порядке обычно ведут ручную настройку ПИД?
AСначала D, потом I, потом P
BСначала Kp (скорость), потом Ki (убрать ошибку), потом Kd (погасить раскачку)
CВсе три сразу
DТолько Ki
2. Что обычно даёт чрезмерный Ki?
AЗамедление системы
BПеререгулирование и колебания
CУсиление шума
DОстаточную ошибку
3. Почему нельзя одновременно максимизировать быстродействие, устойчивость и точность?
AИз-за ограничений датчика
BЭти цели конкурируют: большой Kp ускоряет, но раскачивает, Ki точен, но перерегулирует
CИз-за нехватки памяти
DМожно, если Kd очень большой
py
Курс по теме
Пройдите курс «Python с нуля» — по шагам, с проверкой
8 уроков · ~14 ч · теория, упражнения и экзамен с бейджем
Открыть курс →