Back2Basic: 控制算法PID实现

37 阅读3分钟

控制算法通常应用在各种复杂的非线性系统中,如机器人导航,无人驾驶等。在机器学习中,我们也可以使用PID可以应用于调整神经网络的学习率,以保证在训练过程中收敛的速度和效果。也可以应用于大数据流的负载平衡,通过控制任务的分配来优化系统性能;预测维护大型数据库的性能,通过预测未来的数据负载并提前做出调整,可以避免系统过载,还可以应用于机器学习中的强化学习问题,作为智能体决策的一部分。

PID(比例-积分-微分)和MPC(模型预测控制)是两种常见的控制算法。在机器学习和大数据场景中,这两种方法可以被用来优化系统性能,进行预测,以及作为决策支持工具。

  1. PID控制:这是一种简单而有效的控制策略,其核心思想是通过误差的比例、积分和微分来调节控制输入。在机器学习和大数据场景中,PID控制器可以应用于一些需要实时调整和优化的任务。
  2. MPC控制:这是一种基于模型的优化方法,通过预测未来的系统状态来计算控制输入。

PID控制器的基本原理

PID控制器的名字来源于其三个主要的组成部分:比例(Proportional, P)、积分(Integral, I)、微分(Differential, D)。每个组成部分对于控制器的行为有特定的影响:

image.png 假设 e(t) 是时刻 t 的偏差,u(t) 是时刻 t 的控制信号输出,KpKiKd 分别是比例、积分和微分的增益系数,PID 控制器的数学描述可以表达为:

u(t) = Kp * e(t) + Ki * ∫ e(t) dt + Kd * d/dt[ e(t) ]

其中:

  • Kp * e(t) 是比例项,它是现时刻的偏差。这个值与误差成正比。

  • Ki * ∫ e(t) dt 是积分项,它是过去所有偏差的积分。这个项的作用是消除静态偏差,使系统的稳态误差趋于零。

  • Kd * d/dt[ e(t) ] 是微分项,它是偏差的变化率。这个项预测偏差的未来走势,减少超调和周期性波动以加快系统的响应速度。

具体应用

我们尝试写一个简单的PID控制器,来观察三项对控制系统的影响。

import matplotlib.pyplot as plt
import time

def run_pid(Kp, Ki, Kd, title):
    pid = PID(Kp, Ki, Kd)
    pid.SetPoint=0
    pid.setSampleTime(0.01)

    END = 100
    feedback = 0

    feedback_list = [0]
    time_list = [0]
    setpoint_list = [pid.SetPoint]

    for i in range(1, END):
        pid.update(feedback)
        output = pid.output
        if pid.SetPoint > 0:
            feedback += (output - (1/i))
        if i>9:
            pid.SetPoint = 1
        time.sleep(0.02)

        feedback_list.append(feedback)
        setpoint_list.append(pid.SetPoint)
        time_list.append(i)

    plt.figure(figsize=(10,4))
    plt.plot(time_list, feedback_list, label="Output")
    plt.plot(time_list, setpoint_list, label="Setpoint", linestyle="--")
    plt.ylim([0, 2])
    plt.xlabel('Time (s)')
    plt.ylabel('PID Response')
    plt.title('PID Controller (' + title + ')')
    plt.legend(loc='upper right')
    plt.grid(True)
    plt.show()

通过适当调整 KpKiKd 的值,PID 控制器可以应用于许多不同的控制系统来优化性能。我们对Kp, Ki, Kd做消融实验,会发现下图的变化规律。

  1. 比例(P): 比例项的作用是对错误进行线性的反应。 如果错误大,比例项会尝试以更大的幅度去改正它;如果错误小,比例项会尝试以更小的幅度去改正它。比例增益(Kp)的大小决定了控制器对错误的反应速度:Kp越大,反应越快,但是如果太大,可能会导致系统过度反应,产生振荡。
  2. 积分(I): 积分项的作用是对过去的错误进行累积,以消除持续的偏差。 积分增益(Ki)越大,积分项的效果越明显,能更快的消除偏差,但如果太大,可能会导致系统过度反应,产生振荡。
  3. 微分(D): 微分项的作用是预测错误的变化趋势。 通过减小对快速变化错误的反应,微分项可以使系统更稳定。微分增益(Kd)越大,微分项的效果越明显,可以更好的消除振荡,但如果太大,可能会导致系统反应过慢。

Kp image.png

KI image.png

Kd:

image.png