目录
1. 问题
tf2zp和tf2zpk都是用于由传递函数(Transfer Function)计算系统的零极点,但是它们之间有细微的差别。运行以下脚本:
b = [0.5, 1];
a = [1, 0.5, 1];
[z1,p1,k1] = tf2zp(b,a)
[z2,p2,k2] = tf2zpk(b,a)
得到结果如下:
z1 = -2
p1 =-0.2500 + 0.9682i
-0.2500 - 0.9682i
k1 = 0.5000
z2 = 0 -2
p2 =-0.2500 + 0.9682i
-0.2500 - 0.9682i
k2 = 0.5000
针对同样的输入,tf2zp和tf2zpk计算出来的极点和增益是相同,但是零点略有差异,由tf2zp计算出来的结果中只有一个零点,而 tf2zpk计算出来的结果中有两个零点(多出来一个位置在0处的零点)。这是为什么呢?
2. tf2zp和tf2zpk的差异
关于这一点Mathworks文档有如下说明:
Use
tf2zpk
when working with transfer functions expressed in inverse powers (). A similar function, tf2zp, is more useful for working with positive powers (
), such as in continuous-time transfer functions.
简而言之,就是tf2zpk是用于离散系统传递函数,而tf2zp是用于连续系统传递函数。
连续系统传递函数是基于拉普拉斯变换而得,其中s的幂次通常是以非负整数的形式出现(其根源在于)。而离散系统传递函数是基于z变换而得,其中z的幂次通常是以非正整数的形式出现(其根源则在于
)。
以非负的幂表示和以非正的幂表示其实并没有本质的差别,相互之间也是可以相互转化的,但是在传递函数(在用非正数的幂表示时)的分子的阶数低于分母的阶数时,由非正的幂的形式转换为非负的幂的形式的表示时,却会导致多出来的零点。
以上例来说,b = [0.5, 1]; a = [1, 0.5, 1],当然它用于表示非负的幂的形式的连续系统的传递函数时,表示的是:
很显然,它只有一个零点。
但是,如果它是表示非正的幂的形式的离散系统的传递函数时,表示的则是:
它的确有两个零点:0和-2!
所以,在做从传递函数求零点的计算中,不要忘记所处理的传递函数的表达形式(b和a)是代表离散系统的,还是代表连续系统的传递函数,并据此选择是使用tf2zp还是zp2tf。
有意思的是,在 传递函数、零极点模型以及状态空间模型的相互转换的函数族中,只有从传递函数到零极点区分了连续版和离散版。其它的如zp2tf, tf2ss, ss2tf, ss2zp和zp2ss则都并没有区分连续版和离散版,这是为什么呢?我也还没有想明白。。。^-^一种可能的解释是只有从传递函数求零极点时才会出现这种模糊性。。。待确认
不妨做一个实验,以下代码针对上面代码段生成的两组zpk结果分别调用zp2tf变回去,
[b1,a1] = zp2tf(z1,p1,k1)
[b2,a2] = zp2tf(z2,p2,k2)
b1 = 0 0.5000 1.0000
a1 = 1.0000 0.5000 1.0000
b2 = 0.5000 1.0000 0
a2 = 1.0000 0.5000 1.0000
很明显,所得到的传递函数的分子有差异。我们可以理解为,当从零极点变换会传递函数表现形式时,总是当作非负幂形式的传递函数来看的。