1 什么问题
之前在一个simulink模型进行模型的线性化Model Linearizer
分析时,发现得到传递函数结果和预期总是有差别,排查一番,发现是微分模块“惹的祸”。
2 问题复现
搭建如下的simulink模式。
其中,微分模块来自于continuous
中的Derivative
。
很显然,系统的传递函数为:
G
(
s
)
=
1
10
s
+
1
∗
s
=
s
10
s
+
1
G(s)=\frac{1}{10s+1}*s=\frac{s}{10s+1}
G(s)=10s+11∗s=10s+1s
但是使用Model Linearizer
进行线性化,具体操作步骤如下。
线性化结束后,会自动弹出一个result对话框,在下拉框中选择Transfer Function
。
得到结果如下图,系统有1个输入、1个输出没有问题,但是显示0个states,这个就对了,同时u1-->y1
为0,也就是:
y
1
=
u
1
∗
0
=
0
y1=u1*0=0
y1=u1∗0=0
显然,这不是我们想要的结果。
3 问题分析
双击微分模块,可以看到在参数选项中,提示有一个参数c
,使用s/(c*s+1)
模块(可以理解为一个微分计算+低通滤波)替换理想的微分计算,用以降低微分带来的噪声。
这个参数默认为inf
,也是默认为理想的微分。
打开模块的“Help”,翻到最底部,有一个“Topics"提到了“Linearization”。
打开链接,“谜底”接揭开了。
大意如下:
所以,在没有指定明确的参数c
时,这个模块就作为增益为0模块,与上述我们的验证结果相同。
4 问题验证
把参数c
设定为)0.05,再次进行线性化,得到结果如下。
G
(
s
)
=
1
10
s
+
1
∗
s
0.05
s
+
1
=
2
s
(
10
s
+
1
)
(
0.1
s
+
2
)
=
2
s
s
2
+
20.1
s
+
2
G(s)=\frac{1}{10s+1}*\frac{s}{0.05s+1}=\frac{2s}{({10s+1})(0.1s+2)}=\frac{2s}{s^2+20.1s+2}
G(s)=10s+11∗0.05s+1s=(10s+1)(0.1s+2)2s=s2+20.1s+22s
所以在进行Model Linearizer
时,一定要检测Derivative
的参数。