比例积分微分控制
比例积分微分控制(proportional–integral–derivative control,PID)把当前误差、误差随时间的累积和变化率组合成输入。比例项迅速回应偏差,积分项可消除适当条件下的恒定稳态偏差,微分项回应变化趋势;控制效果由被控对象、参数、测量噪声和执行器约束共同决定。
误差信号与三个系数
令参考值为 、输出为 、误差为 。理想形式为 各系数的单位应使三项与输入同量纲。积分初值也是控制器状态的一部分。理想微分会放大高频噪声,工程实现通常增加低通滤波,或对测量值而非设定值求微分,以减小参考阶跃引起的冲击。[1][2]
一阶对象中的比例与积分
构造归一化对象 ,恒定扰动 ,希望跟踪常数 。只用比例控制 ,稳态满足 例如 ,稳态输出只有 ;增加有限比例增益会减小但不完全消除这个偏差。
加入积分状态 ,取 。对恒定 ,误差满足 。在 下,,因此 积分状态最终为二分之一,维持输入一,使对象能够停留在输出一。
微分项与稳定条件
若理想PID作用于同一个对象且 为常数,代入 得 。闭环特征多项式为 当三个系数均严格为正时,这个二阶多项式的根实部均负,积分状态趋于平衡,从 得 。这是本例的一阶对象结论,不能推广成“所有正PID参数都能稳定任意对象”;延迟、额外惯性或非最小相位特征会改变判据。
数值复核与饱和
下例仅模拟上述PI实例,采用显式Euler近似,步长减小时逼近解析轨迹;不求解一般PID调参。输入为步长和整数步数,不改写外部变量,返回输出序列,时间和返回空间均为 。
import math
def simulate_pi(dt=0.01, steps=500):
if not math.isfinite(dt) or not (0 < dt < 0.5):
raise ValueError("step size must lie in (0, 0.5)")
if type(steps) is not int or steps < 0:
raise ValueError("steps must be a nonnegative integer")
y, z = 0.0, 0.0
outputs = [y]
for _ in range(steps):
error = 1.0 - y
u = 2.0 * error + 2.0 * z
y, z = y + dt * (-y + u), z + dt * error
outputs.append(y)
return outputs
ys = simulate_pi()
print(ys[-1])
print(1 - math.exp(-10))
输出接近一,与解析值 比较可见离散误差。若实际输入被夹在有限区间,误差仍可能使积分状态不断累积,造成饱和解除后的过度控制,称为积分饱和或积分累积;抗饱和设计需要把实际可用输入反馈给积分环节。
变式。 保持对象和PI参数,施加恒定 。稳定平衡仍有 ,此时所需 、;若执行器无法提供所需稳态输入,积分也不能创造缺失的控制能力。
参考资料
- ↑ MathWorks,Proportional-Integral-Derivative (PID) Controllers,Parallel Form;标准形式与导数滤波系数Tf。
- ↑ Seth Teller,MIT6.141: Motor Control,比例、积分、微分项与积分饱和。