7.2.5 线性化电路控制器
文件circuits.py实现了基于递归时间相关反馈线性化(RTCFL)的循环神经网络(RNN)控制电路,该电路包含的神经网络模型用于模拟黑盒Plant模型(plant_bb)和控制器(controller_nn),通过监督学习的方式迭代地优化Plant模型和控制器的性能。在本项目中,根据内部标志(_circuitModeFlag)的状态,将电路分为三个阶段:Step 1训练plant_nn,Step 2训练controller_nn,和最终的RTCFL优化模式。通过时序数据的训练和损失的动态更新,电路实现了对复杂系统的逐步学习和控制。例如 static PID-FOPDT控制器的实现代码如下所示。
class PID_static_FOPDT(circuitBase):
def __init__(self, P: float, I: float, D: float, K: float, tau: float, theta: float) :
"""除了父类参数外,还需要为这个电路中使用的PID控制器和FOPDT系统的静态参数。
参数
----------
P : float
PID控制器的比例(P)参数。
I : float
PID控制器的积分(I)参数。
D : float
PID控制器的微分(D)参数。
K : float
FOPDT系统模型的过程增益(K_p)参数。
tau : float
FOPDT系统模型的过程时间常数(tau_p)参数。
theta : float
FOPDT系统模型的过程死时间(theta_p)参数。
"""
super().__init__()
print(f"PID_static_FOPDT电路已创建!参数如下:\n\tP\t: {P}\n\tI\t: {I}\n\tD\t: {D}\n\tK\t: {K}\n\ttau\t: {tau}\n\ttheta\t: {theta}")
# 在此处创建字段
self.returnDict["P"] = P
self.returnDict["I"] = I
self.returnDict["D"] = D
self.returnDict["K"] = K
self.returnDict["tau"] = tau
self.returnDict["theta"] = theta
self.keysToPlot = ['r', 'u', 'y', 'e']
# 在此处初始化控制器
self._controller = controllers.PID_static(
params={
"P" : self.returnDict["P"],
"I" : self.returnDict["I"],
"D" : self.returnDict["D"]
}
)
# 在此处初始化FOPDT系统
self._plant = plants.FOPDT(
params={
"K" : self.returnDict["K"],
"tau" : self.returnDict["tau"],
"theta" : self.returnDict["theta"]
}
)
def __str__(self):
"""此类的字符串返回覆盖。只是一个描述性名称,用于表示此电路。
"""
return '静态PID到FOPDT电路.'
def getDescriptionString(self) -> str:
"""控制器PID actor和FOPDT actor参数的文本摘要。
"""
return f"PID参数:P={self.returnDict['P']}, I={self.returnDict['I']}, D={self.returnDict['D']}。\nFOPDT参数:K={self.returnDict['K']}, tau={self.returnDict['tau']}, theta={self.returnDict['theta']}."
def execute(self, r) -> float:
"""执行PID_static_FOPDT电路并更新包含在self.returnDict中的列表。请注意,这个字典中的所有列表都需要具有相同的长度,否则调度程序类中的绘图生成将中断。这意味着这些列表中的每个元素的相应索引之间存在上下文时间相关性。
参数
----------
r: float
需要输入电路的r值
返回
-------
Float
Plant模型的最终输出'y'
"""
last_yVal = 0
if len(self.returnDict['y']) > 0 :
last_yVal = self.returnDict['y'][-1]
output_controller = self._controller.execute(r, last_yVal)
output_plant = self._plant.execute(output_controller)
self.returnDict['r'].append(r)
self.returnDict['e'].append(self._controller.getAuxiliaryInfo()['lastError'])
self.returnDict['u'].append(output_controller)
self.returnDict['y'].append(output_plant)
return output_plant
在上述代码中,类PID_static_FOPDT实现了一个简单的静态PID控制器,用于控制一个简单的FOPDT(First-Order Plus Dead Time)系统。通过设置PID和FOPDT系统的参数,该电路模拟了一个具有给定动力学特性的控制系统。execute 方法模拟电路的执行过程,根据输入信号 r 计算控制信号和系统输出,并更新记录这些变量的字典。