位置式PID与增量式PID
1.位置式PID
按模拟PID控制算法,以一系列的采样时刻点kT代表连续时间t,以矩形法数值积分近似代替积分,以一阶后向差分近似代替微分,即:
t ≈ k T ( k = 0 , 1 , 2... ) ∫ o t e r r o r ( t ) d t ≈ T ∑ j = 0 k e r r o r ( j T ) ≈ T ∑ j = 0 k e r r o r ( j ) d e r r o r ( t ) d t ≈ e r r o r ( k T ) − e r r o r ( ( k − 1 ) T ) T = e r r o r ( k ) − e r r o r ( k − 1 ) T t≈kT (k=0,1,2...) \\ \int_o^terror(t)dt ≈T\sum_{j=0}^kerror(jT)≈T\sum_{j=0}^kerror(j) \\ \frac{\mathrm{d}error(t)}{\mathrm{d}t}≈\frac{error(kT)-error((k-1)T)}{T}=\frac{error(k)-error(k-1)}{T} t≈kT(k=0,1,2...)∫oterror(t)dt≈Tj=0∑kerror(jT)≈Tj=0∑kerror(j)dtderror(t)≈Terror(kT)−error((k−1)T)=Terror(k)−error(k−1)
可得离散PID表达式:
u ( k ) = k p ( e r r o r ( k ) + T T I ∑ j = 0 k e r r o r ( j ) + T D T ( e r r o r ( k ) − e r r o r ( k − 1 ) ) ) u ( k ) = k p e r r o r ( k ) + k i ∑ j = 0 k e r r o r ( j ) T + k d e r r o r ( k ) − e r r o r ( k − 1 ) T u(k)=k_p(error(k)+\frac{T}{T_I}\sum_{j=0}^kerror(j)+\frac{T_D}{T}(error(k)-error(k-1))) \\ u(k)=k_perror(k)+k_i\sum_{j=0}^kerror(j)T+k_d\frac{error(k)-error(k-1)}{T} u(k)=kp(error(k)+TITj=0∑kerror(j)+TTD(error(k)−error(k−1)))u(k)=kperror(k)+kij=0∑kerror(j)T+kdTerror(k)−error(k−1)
k_p = 1;
k_i = 1;
k_d = 1;
T = 0.1; N = 100;
error = zeros(1, N);
u = zeros(1, N);
error_sum = 0; setpoint = 1;
output = 0; for k = 1:Nerror(k) = setpoint - output;error_sum = error_sum + error(k);% 计算微分项if k > 1d_error = (error(k) - error(k-1)) / T;elsed_error = 0; endu(k) = k_p * error(k) + k_i * error_sum * T + k_d * d_error;output = output + u(k); end% 绘制控制输入和输出的变化
figure;
plot(1:N, u, 'r', 'LineWidth', 2);
title('PID Control Input u(k)');
xlabel('Time step k');
ylabel('Control Input u(k)');
2.增量式PID
当执行机构需要的是控制量的增量(如驱动步进电机)时,应采用增量式PID控制。根据地推原理可得:
u ( k − 1 ) = k p ( e r r o r ( k − 1 ) + k i ∑ j = 0 k − 1 e r r o r ( j ) + k d ( e r r o r ( k − 1 ) − e r r o r ( k − 2 ) ) ) u(k-1)=k_p(error(k-1)+k_i\sum_{j=0}^{k-1}error(j)+k_d(error(k-1)-error(k-2))) u(k−1)=kp(error(k−1)+kij=0∑k−1error(j)+kd(error(k−1)−error(k−2)))
递推原理解释:
为什么在离散时间系统的递推关系中,通常只涉及到前两次输出
y_1
,y_2
和前两次输入u_1
,u_2
,而不是更多次的输入和输出。离散时间系统的阶数
在离散时间系统的递推关系中,实际使用的输入和输出的“历史”数量与系统的阶数(或传递函数的阶数)直接相关。阶数决定了系统的动态响应的复杂性,阶数较低的系统只需要考虑少量的过去输出和输入,而阶数较高的系统则需要更多的过去输出和输入。
- 如果我们有一个 二阶(second-order)系统,通常递推公式只涉及到 前两次的输入和输出,因为它已经足够描述系统的动态行为。
- 对于一个 三阶 或更高阶的系统,递推公式则可能会涉及更多的历史输入和输出。
阶数的概念来源于系统的传递函数的分母和分子阶数。具体来说,离散时间系统的递推关系来源于传递函数的分子和分母的多项式。假设传递函数是这样的形式:
G ( z ) = n u m 0 + n u m 1 z − 1 + n u m 2 z − 2 1 + d e n 1 z − 1 + d e n 2 z − 2 G(z) = \frac{num_0 + num_1 z^{-1} + num_2 z^{-2}}{1 + den_1 z^{-1} + den_2 z^{-2}} G(z)=1+den1z−1+den2z−2num0+num1z−1+num2z−2
在这个传递函数中,分母的阶数决定了当前输出(
y(k)
)与前几次输出(y(k-1)
,y(k-2)
等)之间的关系。分子的阶数决定了输入(u(k)
,u(k-1)
等)如何影响输出。
- 分母阶数(如
den_1
,den_2
) 决定了系统输出如何依赖于过去的输出(反馈)。- 分子阶数(如
num_1
,num_2
) 决定了系统输出如何依赖于过去的输入。为什么是有限次的历史输入和输出
系统的阶数决定了历史输入和输出的个数
有限阶系统: 大多数实际控制系统在设计时会选择一个有限阶数,这意味着输出
y(k)
只与系统的有限个历史输出和输入有关。也就是说,通常情况下我们只关心系统的前两次或前三次输出和输入,而不需要考虑无限次历史数据。高阶系统: 对于一个 n阶 系统,递推公式中最多会包含
n
次历史输出和n
次历史输入。换句话说,一个 二阶系统(如你提供的示例)只考虑前两次输出和输入。若是一个 三阶系统,则递推公式会涉及前三次输出和输入。在现实中,大多数系统都可以通过相对较低阶的模型来很好地近似其行为,因此通常只使用前两次(或最多前三次)的输入和输出数据进行计算。
递推关系的稳定性
- 系统的稳定性 与系统阶数、系数以及历史输入输出的数量紧密相关。随着历史数据(如输入和输出的次数)增加,递推公式可能会变得更复杂,但也更难以稳定计算。而在大多数实际应用中,二阶或三阶系统已经足够描述系统的动态行为。
离散化和系统的记忆性
在离散时间系统中,系统的记忆性(即系统如何依赖过去的状态)与其阶数和传递函数的结构紧密相关。离散时间传递函数的分子和分母系数表示了系统的因果关系和记忆特性。对于一个阶数较低的系统,它通常只有有限的“记忆”,即它只会受到过去有限次输入和输出的影响。
示例:二阶系统的递推关系
假设我们有一个二阶离散时间系统,其传递函数形式为:
G ( z ) = n u m 2 z − 1 + n u m 3 z − 2 1 + d e n 1 z − 1 + d e n 2 z − 2 G(z) = \frac{num_2 z^{-1} + num_3 z^{-2}}{1 + den_1 z^{-1} + den_2 z^{-2}} G(z)=1+den1z−1+den2z−2num2z−1+num3z−2
从这个传递函数可以看出,系统的输出
y(k)
依赖于输入的前两次u_1
和u_2
,以及输出的前两次y_1
和y_2
。它的递推关系通常表示为:y ( k ) = − d e n 1 y ( k − 1 ) − d e n 2 y ( k − 2 ) + n u m 2 u ( k − 1 ) + n u m 3 u ( k − 2 ) y(k) = -den_1 y(k-1) - den_2 y(k-2) + num_2 u(k-1) + num_3 u(k-2) y(k)=−den1y(k−1)−den2y(k−2)+num2u(k−1)+num3u(k−2)
这个公式表示当前输出
y(k)
与前两次输出y(k-1)
和y(k-2)
以及前两次输入u(k-1)
和u(k-2)
之间的线性关系。为什么不考虑更多次的输入和输出
- 简化模型: 在大多数实际应用中,控制系统的动态行为可以通过较低阶的递推关系来描述,更多次的历史输入输出可能会带来冗余,并且计算复杂度会大大增加。
- 系统物理特性: 大多数物理系统或控制系统的动态行为通常是局部的,即它们的响应对过去的状态有一定的衰减。超过一定数量的过去状态,系统的响应会变得微不足道,因此不需要更多次的历史输入和输出。
- 计算效率: 考虑更多次的历史输入和输出会显著增加计算的复杂度,尤其是对于实时系统或嵌入式系统来说,过多的历史数据可能导致计算资源的浪费。
结论
- 系统阶数决定了在递推关系中需要考虑多少次的历史输入和输出。一个二阶系统通常只需要考虑前两次的输出和输入,而三阶系统则需要考虑前三次。
- 大多数实际控制系统是基于有限阶数设计的,通常不需要更多次的历史输入和输出来准确描述系统行为。
通过这些理由,线性递推关系通常只涉及到系统阶数所决定的有限个历史输入和输出。
增量式PID控制算法:
Δ u ( k ) = u ( k ) − u ( k − 1 ) Δ u ( k ) = k p ( e r r o r ( k ) − e r r o r ( k − 1 ) ) + k i e r r o r ( k ) + k d ( e r r o r ( k ) − 2 e r r o r ( k − 1 ) + e r r o r ( k − 2 ) ) \Delta u(k)=u(k)-u(k-1) \\ \Delta u(k)=k_p(error(k)-error(k-1))+k_ierror(k)+k_d(error(k)-2error(k-1)+error(k-2)) Δu(k)=u(k)−u(k−1)Δu(k)=kp(error(k)−error(k−1))+kierror(k)+kd(error(k)−2error(k−1)+error(k−2))
增量式PID由于不需要累加,控制增量u(k)仅与最近k次的采样有关,所以误动作时影响小,而且比较容易通过甲醛处理获得比较好的控制效果。
根据增量式PID控制算法,设计仿真程序,被控对象如下:
G ( s ) = 400 s 2 + 5 s G(s)=\frac{400}{s^2+5s} G(s)=s2+5s400
PID控制参数:kp=8,ki=0.1,kd=10。
% incerment pid controllerclear all;
close all;ts = 0.001;
sys = tf(400,[1,50,0]);
dsys=c2d(sys, ts, 'z');
[num, den] = tfdata(dsys, 'v');u_1 = 0.0;
u_2 = 0.0;
u_3 = 0.0;y_1 = 0;
y_2 = 0;
y_3 = 0;x = [0, 0, 0]';error_1 = 0;
error_2 = 0;for k =1:1:1000time(k) = k*ts;yd(k) = 1.0;kp = 8;ki = 0.1;kd = 10;du(k) = kp*x(1) + kd*x(2) + ki*x(3);u(k) = u_1 + du(k);if u(k)>=10u(k) = 10;endif u(k)<= -10u(k) = -10;endy(k) = -den(2)*y_1 - den(3)*y_2 + num(2)*u_1 + num(3)*u_2;error = yd(k)-y(k);u_3 = u_2; u_2 = u_1; u_1 = u(k);y_3 = y_2; y_2 = y_1; y_1 = y(k);x(1) = error - error_1; % px(2) = error - 2*error_1 + error_2; % dx(3) = error; % ierror_2 = error_1; error_1 = error;
endfigure(1);
plot(time, yd, 'r', time, y, 'k', 'LineWidth', 2);
xlabel('time(s)'); ylabel('yd,y');
legend('ideal position value', 'tracking position value');
图像为:
3.位置式与增量式区别
比较项 | 位置式 PID | 增量式 PID |
---|---|---|
控制量计算方式 | 控制量 ( u(k) ) 是当前误差、误差积分、和误差微分的加权和。 | 控制量增量 ( \Delta u(k) ),即当前控制量是上一时刻控制量加上增量。 |
公式形式 | ( u(k) = k_p e(k) + k_i \sum_{j=0}^{k} e(j) T + k_d \frac{e(k) - e(k-1)}{T} ) | ( \Delta u(k) = k_p e(k) + k_i e(k) T + k_d \frac{e(k) - e(k-1)}{T} ), ( u(k) = u(k-1) + \Delta u(k) ) |
误差依赖 | 直接依赖于当前误差、历史误差的积累及误差变化。 | 通过控制量的增量来调整系统,依赖于当前误差与上次误差差异。 |
系统初始化 | 初始时,控制量为零或其他值,误差的历史会影响计算。 | 初始时,控制量通常为零,系统通过增量逐渐调整。 |
计算复杂度 | 需要计算误差的累积(积分项)和当前与上一时刻误差的差异(微分项)。 | 仅计算当前误差与前一时刻误差差的增量,因此计算更简单。 |
控制量变化 | 控制量直接根据所有历史误差计算,可能会导致较大的控制量变化。 | 控制量变化平滑,由于控制量是基于增量计算的,避免了大幅度波动。 |
抗饱和能力 | 如果没有适当的限制,可能出现控制量“饱和”现象(特别是积分项积累过多)。 | 通常具有更好的抗饱和能力,因为控制量是增量形式,不会导致误差过度积累。 |
适应性 | 对于系统动态变化较大的情况,可能导致调节不及时。 | 更容易适应系统的变化,因为每次调整的是控制量的增量而非绝对控制量。 |
稳定性 | 稍微不当的增益选择可能导致系统振荡或不稳定。 | 增量控制通常更加平稳,避免了系统的不稳定。 |
优点 | 1. 计算直接,适合大多数控制问题。 | 1. 控制量变化平滑,避免了大幅波动和系统不稳定。 |
2. 适用于需要较大调节量的系统。 | 2. 通常适应性较强,适合具有较高非线性和变化的系统。 | |
缺点 | 1. 控制量可能会过大,导致系统反应过于剧烈。 | 1. 需要保存前一时刻的控制量,增加存储要求。 |
2. 积分项容易导致“积分风暴”,如果不限制,会造成饱和。 | 2. 如果误差较大,控制效果可能较差,可能需要更精细的调节。 |
总结:
-
位置式 PID 通过绝对的控制量直接响应当前误差的情况,适用于大多数需要精确控制的系统。它的缺点是容易导致控制量的过度调节,特别是积分项可能引发“积分风暴”或饱和现象。
-
增量式 PID 通过增量调整控制量,避免了控制量的剧烈波动,通常具有更好的稳定性和抗饱和能力。它特别适用于对控制量变化要求平滑的系统,但由于增量控制的特性,当误差较大时,可能会需要更精细的增益调节。
在实际应用中,选择哪种方法要根据具体的系统特点和调节需求来决定。如果系统对控制量波动敏感或易于饱和,增量式PID可能更为合适。如果需要较大调整或精确的控制,位置式PID可能更具优势。