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()
![]()