1. 原****由
传递函数是针对线性时不变(Linear Time-Invariant,LTI)系统定义的,严格来说,时变传递函数的说法并不十分严谨。但 “时变”和“非线性”才是实际系统的本质特性,就拿最简单的RC电路来说,电阻会随温度变化,电容也会随使用时间发生变化,RC参数的变化就会造成传递函数的时变。对于已经建好的传递函数,需要分析参数时变的影响时,或者已经建好的某种控制算法,需要验证对于参数时变的适应能力时,应该如何处理呢?
这时,由线性时不变系统传递函数推广得到的时变传递函数是一个不错的选择。
2. 方法
2.1 方法一:通过微分方程实现时变传递函数
传递函数由微分方程通过拉普拉斯(Laplace)变换得到,已知传递函数形式后,可以反推出微分方程,再在Simulink中利用基本模块搭建模型。
如某时变二阶系统,其传递函数为:
其中,k(t),a(t),b(t)为时变参数。
传递函数反推出微分方程为:
上述微分方程在Simulink中容易搭建:
更方便的是,Matlab 2017b之后在控制系统工具箱(Control system toolbox)中推出了时变传递函数模块(Varying Transfer Function),可供用户直接选用。
Simulink自带的这个时变传递函数模块(Varying Transfer Function)就是使用的微分方程方法实现的。
2.2 方法二:通过状态空间实现时变传递函数
传递函数还可以转变为状态空间形式,如上述二阶系统可转变为可控标准型状态空间:
通过上述状态空间形式也可在Simulink中方便的实现时变传递函数。同样,Matlab 2017b之后在控制系统工具箱(Control system toolbox)中推出了时变状态空间模块(Varying State Space),可供用户直接选用。
2.3 方法三:通过S函数实现时变传递函数
核心思路与方法二相同,即:传递函数转变为状态空间(可选可控标准型和可观标准型),通过传递函数系数重构状态空间矩阵,通过状态空间实现时变传递函数。
在Matlab 2017b版本中推出线性时变系统表达方式之前,笔者早年使用Level-2 S函数开发时变传递函数模块,可供Matlab 2017b版本以前的用户使用 ,也可供需要学习Level-2 S函数使用方法的用户参考。
2.4 方法四:通过DCP模块实现时变传递函数
Simulink中的传递函数模块(Transfer Fcn)的分子系数(Numerator coefficients)和分母系数(Denominator coefficients)都支持在线调整,即在仿真过程中可通过set_param函数来在线调整传递函数的分子分母系数,由此实现时变传递函数。
笔者开发的DCP模块可实现各类模块在线更新参数的需求,通过DCP模块可方便的实现时变传递函数。
3. 演示
二阶时变传递函数:
参数时变规律为:
四种方法的Simulink模型:
阶跃响应仿真结果:
正弦响应仿真结果:
分析仿真结果 :
其主要原因为四种建模方式不同,模型中的记忆环节(如积分环节、状态量)选取不同,记忆环节与输出之间的映射关系也不同,因此某些参数变化体现在记忆环节之前的输入参数中,有些参数变化体现在记忆环节之后的输出参数中,由此造成突变瞬间动态过程的响应差别,但进入稳态后的响应是相同的。应用中需要根据实际系统的特点灵活选择实现方式。