7.2 基于深度学习的反馈控制系统
在下面的项目中,实现了一个反馈控制系统的仿真工具,分别实现了基于不同电路模型(如PID、RTCFL_RNN等)的控制器与Plant模型的集成仿真。通过调度器、电路模型和参数配置,用户可以模拟不同控制策略对于各种输入信号的动态响应。该工具提供了灵活的输入方式,支持从文本文件读取输入信号,同时能生成相应的响应曲线图,方便用户直观了解不同控制策略的性能表现。项目中还使用了深度学习技术,如循环神经网络,为用户提供更复杂的控制策略建模和仿真能力。
实例7-2:基于深度学习的反馈控制系统(源码路径:codes\7\feed\pid.py)
7.2.1 项目介绍
本项目是一个综合了控制反馈系统仿真和深度学习技术的工具。通过该工具,用户可以模拟和评估不同控制策略(如PID、RTCFL_RNN等)对于各种输入信号的动态响应。深度学习技术在项目中得以应用,提供了更灵活和复杂的控制策略建模能力,例如使用循环神经网络(RNN)进行模型训练。用户能够通过调度器、电路模型和灵活的参数配置,以及支持从文本文件读取输入信号的方式,进行仿真实验,并生成相应的响应曲线图,从而直观地了解不同控制策略的性能表现。这使得项目成为一个综合了传统控制方法和深度学习的强大工具,可用于系统动态响应分析和控制算法优化。
7.2.2 框架设计
文件base.py定义了一个用于控制反馈系统模拟的基础框架,主要包括三个类:actorBase(通用的执行者),plantBase(Plant/过程的基类),controllerBase(控制器的基类)。这个框架为用户提供了一个灵活的结构,可以通过继承这些基类创建不同类型的执行者、Plant和控制器,并通过相应的调度器(scheduler)进行模拟和测试。整体上,这个框架提供了一个通用的结构,使得用户能够轻松构建和测试控制反馈系统。
from lib import *
import abc
class actorBase(abc.ABC):
"""执行者的基类。
"""
@abc.abstractmethod
def __init__(self, params={}):
"""构造函数
参数
----------
params : dict
执行者的静态参数字典,默认为空
"""
pass
@abc.abstractmethod
def execute(self, inputs: Dict[str, float]) -> float:
"""该函数封装了执行者在单个时间步骤中需要进行的所有计算。
调用当前和历史输入(如果需要),并返回单个输出浮点数。
同时将必要的值存储到执行者具有的任何字段中。
参数
----------
inputs: Dict
输入字典,其中字典中的每个元素应为单个浮点数。
对于控制器,默认情况下应只有 r。
对于Plant,字典可能需要包含更多项目,这需要进行异常强制执行。
返回
-------
Float
执行者的输出值
"""
output = -69
return output
@abc.abstractmethod
def paramAdj(self, inputs):
"""允许在类被实例化后调整特定允许参数/类字段的参数。
参数
----------
inputs :
输入可以是任何格式,应符合执行者的具体要求。
"""
pass
@abc.abstractclassmethod
def getAuxiliaryInfo(self) -> Dict:
"""返回执行者中不是输入或输出的所有参数和其他信息的字典。
返回
-------
Dict
执行者的所有 '内部' 信息字典。
"""
outputDict = {}
return outputDict
class plantBase(actorBase):
"""Plant基类,是执行者的子类。
父类:actorBase
"""
@abc.abstractmethod
def __init__(self, params={}):
"""在此初始化Plant的特定字段
参数
----------
params : dict, optional
用于Plant的静态参数字典,默认为空
"""
super().__init__(params)
@abc.abstractmethod
def execute(self, inputs: Dict[str, float]) -> float:
"""该函数封装了Plant在单个时间步骤中需要进行的所有计算。
调用当前和历史输入(如果需要),并返回单个输出浮点数。
同时将必要的值存储到Plant具有的任何字段中。
参数
----------
inputs: Dict
输入字典,其中字典中的每个元素应为单个浮点数。
对于Plant,字典可能需要包含更多项目,这需要进行异常强制执行。
返回
-------
Float
Plant的输出值。
"""
output = super().execute(inputs)
return output
def paramAdj(self, inputs):
"""允许在类被实例化后调整特定允许参数/类字段的参数,这不是一个抽象方法,因为在这个子类中没有强制要求实现。
参数
----------
inputs :
输入可以是任何格式,应符合执行者的具体要求。
"""
pass
@abc.abstractclassmethod
def getAuxiliaryInfo(self) -> Dict:
"""返回Plant中不是输入或输出的所有参数和其他信息的字典,这不是一个抽象方法,因为在这个子类中没有强制要求实现。
返回
-------
Dict
Plant的所有 '内部' 信息字典。
"""
pass
class controllerBase(actorBase):
"""控制器基类,是执行者的子类。
父类:actorBase
"""
@abc.abstractclassmethod
def __init__(self, params={}):
"""在此初始化控制器的特定字段
参数
----------
params : dict, optional
用于控制器的静态参数字典,默认为空
"""
super().__init__(params)
@abc.abstractclassmethod
def execute(self, inputs: Dict[str, float]) -> float:
"""该函数封装了控制器在单个时间步骤中需要进行的所有计算。
调用当前和历史输入(如果需要),并返回单个输出浮点数。
同时将必要的值存储到控制器具有的任何字段中。
参数
----------
inputs: Dict
输入字典,其中字典中的每个元素应为单个浮点数。
对于控制器,字典可能需要包含更多项目,这需要进行异常强制执行。
返回
-------
Float
控制器的输出值
"""
output = super().execute(inputs)
return output
def paramAdj(self, inputs):
"""允许在类被实例化后调整特定允许参数/类字段的参数。
不是一个抽象方法,因为在这个子类中没有强制要求实现。
参数
----------
inputs :
输入可以是任何格式,应符合执行者的具体要求。
"""
pass
@abc.abstractclassmethod
def getAuxiliaryInfo(self) -> Dict:
"""返回控制器中不是输入或输出的所有参数和其他信息的字典。
不是一个抽象方法,因为在这个子类中没有强制要求实现。
返回
-------
Dict
控制器的所有 '内部' 信息字典。
"""
pass
对上述代码的具体说明如下所示:
- 类actorBase:作为通用执行者的基类,定义了执行者的抽象方法,包括构造函数__init__,执行函数execute,参数调整函数paramAdj以及获取辅助信息的函数getAuxiliaryInfo。该类规定了执行者的基本结构和操作,包括输入、输出和内部参数的处理。
- 类plantBase:继承自actorBase,作为Plant/过程的基类,重写了执行函数execute。Plant执行函数中包括对输入的处理,并定义了参数调整和获取辅助信息的方法。Plant类是执行者的一种特例,用于模拟系统的过程和动力学行为。
- 类controllerBase:继承自actorBase,作为控制器的基类,同样重写了执行函数execute。控制器执行函数中包括对输入的处理,并定义了参数调整和获取辅助信息的方法。控制器类用于实现不同的控制算法,如PID、RNN和DNN。