PID控制惯性环节的阶跃响应

class PID:
    def __init__(self, kp, ki, kd):
        self.kp = kp
        self.ki = ki
        self.kd = kd
        self.prev_error = 0
        self.integral = 0

    def update(self, setpoint, current_value, dt):
        error = setpoint - current_value
        self.integral += error * dt
        derivative = (error - self.prev_error) / dt
        output = self.kp * error + self.ki * self.integral + self.kd * derivative
        self.prev_error = error
        return output


if __name__ == "__main__":
    # 初始化 PID 控制器参数
    kp = 1.0
    ki = 0.1
    kd = 0

    pid = PID(kp, ki, kd)
    current_value = 0  # 当前值
    dt = 1  # 时间步长
    out = np.empty((0, 3))

    # 惯性环节参数
    K = 1
    T = 30

    for i in range(200):
        if i < 10:
            setpoint = 0
        else:
            setpoint = 1
        control_output = pid.update(setpoint, current_value, dt)

        # 惯性环节响应更新        
        current_value =  (1- dt / T) * current_value + ((dt / T) * K ) * control_output
        out = np.append(out, np.array([[i, setpoint, current_value]]), axis=0)


    plt.plot(out[:, 0], out[:, 1], label='设定值')
    plt.plot(out[:, 0], out[:, 2], label='系统输出')
    plt.xlabel('时间 (s)')
    plt.ylabel('输出')
    plt.title('PID 控制时间常数为 30 的惯性环节的阶跃响应')    
    plt.legend()
    plt.show()

posted @ 2025-04-13 13:34  华小电  阅读(34)  评论(0)    收藏  举报