做金融网站看那些素材,江门网红打卡景点蓬江区,浦东网站建设哪家好,有什么免费建站网站PID 控制算法概念
在我们的生活中可能大家都没有听说过 PID 控制算法#xff0c;但它可以说是无处不在#xff0c;小到空调的温度控制、无人机的精准悬停、机器人运作系统#xff0c;大到飞机和火箭的飞行姿态控制都有 PID 的身影。
PID 控制算法#xff0c;即比例 - 积分…PID 控制算法概念
在我们的生活中可能大家都没有听说过 PID 控制算法但它可以说是无处不在小到空调的温度控制、无人机的精准悬停、机器人运作系统大到飞机和火箭的飞行姿态控制都有 PID 的身影。
PID 控制算法即比例 - 积分 - 微分Proportional-Integral-Derivative控制算法是一种广泛应用于各种自动控制系统中的反馈控制算法。PID 控制器通过计算控制误差的三种成分 —— 比例P、积分I和微分D来调节系统输出使得系统的输出达到目标值。
PID 控制算法的运行步骤
1 比例控制P 部分
这是 PID 中的最简单基本比例控制算法。这个环节产生的分力是 f p k p × e ( t ) f_pk_p\times e(t) fpkp×e(t) 我们就拿水桶倒水来介绍 PID 控制算法。设水位目标高度为 1 1 1当前水位为 0.2 0.2 0.2 米那么当前时刻的水位和目标水位之间是存在一个误差的 e ( t ) e(t) e(t)且 e ( t ) 10 − 2 8 e(t)10-28 e(t)10−28 米。如果单纯的用比例控制算法就是指加入的水位 f p f_p fp 和误差 e ( t ) e(t) e(t) 是成正比的。假设 k p kp kp 取 0.5 0.5 0.5 那么 t 1 t1 t1 时表示第 1 1 1 次加水也就是第 1 1 1 次对系统施加控制那么 f p 0.5 × 0.8 0.4 f_p0.5\times 0.80.4 fp0.5×0.80.4所以这一次加入的水量会使水位在 0.2 0.2 0.2 的基础上上升 0.4 0.4 0.4达到 0.6 0.6 0.6。接着 t 2 t2 t2 时第 2 2 2 次施加控制当前水位是 0.6 0.6 0.6所以 e ( t ) e(t) e(t) 是 0.4 0.4 0.4。 f p 0.5 × 0.4 0.2 f_p0.5\times 0.40.2 fp0.5×0.40.2会使水位再次上升 0.2 0.2 0.2达到 0.8 0.8 0.8。如此这么循环下去就是比例控制算法的运行方法。可以看到最终水位会达到我们需要的 1 1 1 米。
2 微分控制D 部分
从上面我们可以看出来在不断加水的过程中是会产生震荡的那想要阻止震荡就只能用微分控制了。微分环节也会计算出一个分力计算方法是 f d k d × d e ( t ) d t f_dk_d\times\frac{\mathrm{d}e(t)}{{\rm d}t} fdkd×dtde(t) 也就是说这个分力与误差的变化速度有关。假设目标位置不变水位向上运动时误差减小即误差变化速度为负分力向下反之当水位向下运动时分力向上综合看来微分环节产生的分力始终阻碍水位的运动。
因此如果在刚刚的基础上加入微分产生的分力就会产生一个阻尼效果水位会仿佛始终受到一个阻力因此上下摆动的幅度会逐渐减小最终收敛到目标位置上。
3 积分控制I 部分
但现在我们更希望在水位有一些外部干扰时也能实现上面的效果比如我们在水桶上有一个洞这样就要使用积分控制了它的计算方法是 f i k i × ∫ e ( t ) d t f_ik_i\times \int_{}^{} e(t)\, {\rm d}t fiki×∫e(t)dt 也就是说积分环节产生的分力正比于误差的积分当误差持续存在时这个分力会逐渐变大试图消除误差。
加入积分作用我们的 PID 就能完美实现在有恒力干扰的情况下对水位的控制了
公式
经上面分析可得知 u ( t ) k p × e ( t ) k d × d e ( t ) d t k i × ∫ e ( t ) d t u(t)k_p\times e(t)k_d\times\frac{\mathrm{d}e(t)}{{\rm d}t}k_i\times \int_{}^{} e(t)\, {\rm d}t u(t)kp×e(t)kd×dtde(t)ki×∫e(t)dt
PID 控制算法代码实现
#includebits/stdc.h
using namespace std;
double tl0.0; //目标追踪位置
double nl0.0; //目标当前位置
float kp,ki,kd;
int main(){double ep0; //kp误差double ei0; //ki误差double ed0; //kd误差double edp0; //表示e(k-1),上一次的kp误差,用于计算kd误差cout请输入目标追踪值endl;cintl;cout请输入kpendl;cinkp;cout请输入kiendl;cinki;cout请输入kdendl;cinkd;edptl-nl;//整个系统第一次计算kd时、 e(k)-e(k-1)。 while(nl!tl){eptl-nl;eiep;edep-edp;edpep;nlkp*epki*eikd*ed;cout当前位置为nl当前的误差为tl-nlendl;}
}