# zpk
零极点增益模型
# 描述
使用 zpk 创建零极点增益模型,或将动态系统模型转换为零极点增益形式。
零极点增益模型是以因子形式表示的传递函数。例如,考虑以下连续时间单输入单输出传递函数:
G(s) 可以分解为零极点增益形式:
SISO 零极点增益模型的更通用表示形式如下:
这里,z 和 p 分别是实数或复数零点和极点的向量,K 是实数或复数标量增益
你可以通过直接指定零点、极点和增益来创建零极点增益模型对象,或者将另一种类型的模型(例如状态空间模型 ss )转换为零极点增益形式。
你可以使用 zpk 创建通用状态空间(genss)模型或不确定状态空间( uss(鲁棒控制工具箱))模型。
# 创建
# 语法
sys = zpk(zeros, poles, gain)
sys = zpk(zeros, poles, gain, ts)
sys = zpk(zeros, poles, gain, ltiSys)
sys = zpk(m)
sys = zpk(___, Name, Value)
sys = zpk(ltiSys)
sys = zpk(ltiSys, component)
s = zpk('s')
z = zpk('z', ts)
# 说明
sys = zpk(zeros, poles, gain) 创建一个连续时间零极点增益模型,其中 zeros 和 poles 分别用向量指定, gain 的标量值为标量。输出 sys 是一个 zpk 模型对象,存储模型数据。将 zeros 或 poles 设为 [] 以表示系统没有零点或极点。这两个输入不必长度相等,且模型不必是恰当的(即,极点数量不必少于零点数量)。
sys = zpk(zeros, poles, gain, ts) 创建一个离散时间零极点增益模型,采样时间为 ts。将 ts 设为 -1 或 [] 可以不指定采样时间。
sys = zpk(zeros, poles, gain, ltiSys) 创建一个零极点增益模型,其属性继承自动态系统模型 ltiSys,包括采样时间。
sys = zpk(m) 创建一个零极点增益模型来表示静态增益 m。
sys = zpk(___, Name, Value) 使用一个或多个名称-值对参数设置零极点增益模型的属性,适用于上述任一输入参数组合。
sys = zpk(ltiSys) 将动态系统模型 ltiSys 转换为零极点增益模型。
sys = zpk(ltiSys, component) 将指定的 component 转换为零极点增益模型形式。仅当 ltiSys 是已识别的线性时不变(LTI)模型(如 idss 或 idtf 模型)时,才能使用此语法。
s = zpk('s') 创建一个特殊变量 s,您可以在有理表达式中使用该变量来创建连续时间零极点增益模型。使用有理表达式有时比指定多项式系数更方便且直观。
z = zpk('z', ts) 创建一个特殊变量 z,您可以在有理表达式中使用该变量来创建离散时间零极点增益模型。要使采样时间未指定,请将 ts 输入参数设置为 -1 。
# 输入参数
zeros - 零极点增益模型的零点行向量 | Ny -by- Nu 行向量细胞数组
零极点增益模型的零点,指定为:
- 单输入单输出模型的一行向量。例如,使用 [1, 2+i, 2-1] 创建具有零点在 s = 1 、 s = 2+i 和 s = 2-i 的模型;
- 一个 Ny 行 Nu 列的单元数组,用于指定多输入多输出零极点增益模型,其中 Ny 是输出数,Nu 是输入数。
例如,如果 a 是一个名为 realp 的可调参数,其名义值为 3 ,那么你可以使用 zeros = [1 2 a] 创建一个具有零点 s = 1 和 s = 2 以及一个可调零点 s = 3 的 genss 模型。
这也是 zpk 对象的一个属性。此输入参数设置属性 Z 的初始值。
poles - 零极点增益模型的极点行向量 | Ny -by- Nu 行向量细胞数组
零极点增益模型的极点,指定为:
- 单输入单输出(SISO)模型的一行向量;
- 一个 Ny 行数 - 由 Nu 列数 组成的单元数组,用于指定多输入多输出(MIMO)零极点增益模型,其中 Ny 是输出数,Nu 是输入数。
也是 zpk 对象的一个属性。此输入参数设置属性 P 的初始值。
gain - 零极点增益模型的增益行向量 | Ny -by- Nu 行向量细胞数组
零极点增益模型的增益,指定为:
- 对于单输入单输出(SISO)模型,是一个标量;
- 对于多输入多输出(MIMO)模型,是一个 Ny 行 Nu 列的矩阵,其中 Ny 是输出数,Nu 是输入数。
也是 zpk 对象的一个属性。此输入参数设置属性 K 的初始值。
ts - 采样时间标量
采样时间,指定为标量。也是 zpk 对象的一个属性。此输入参数设置属性 Ts 的初始值。
ltiSys - 动态系统动态系统模型 | 模型数组
动态系统,指定为单输入单输出(SISO)或多输入多输出(MIMO)动态系统模型或动态系统模型数组。您可以使用的动态系统包括:
连续时间或离散时间的数值 LTI 模型,如 tf 、 zpk 、 ss 或 pid 模型;
广义或不确定的时不变模型,如 genss 或 uss (鲁棒控制工具箱)模型。
生成的零极点增益模型假设
- 可调控制设计块的当前值;
- 不确定控制设计块的名义模型值。
识别的 LTI 模型包括 idtf(系统辨识工具箱)、idss(系统辨识工具箱)、idproc(系统辨识工具箱)、idpoly(系统辨识工具箱)和 idgrey(系统辨识工具箱)模型。要选择要转换的辨识模型的组件,请指定 component。如果不指定 component,tf 将默认转换辨识模型的测量组件。(使用辨识模型需要系统辨识工具箱软件)。
无法将已识别的非线性模型转换为 zpk 模型对象。您可能首先使用线性近似函数,如 linearize 和 linapp(此功能需要系统辨识工具箱软件)。
m - 静态增益标量 | 矩阵
静态增益,指定为标量或矩阵。系统的静态增益或稳态增益表示在稳态条件下输出与输入的比值。
component - 识别模型的组件'measured' (默认)| 'noise' | 'augmented'
指定要转换的已识别模型的组件,可以是以下之一:
- 'measured' - 将 sys 的测量部分转换为;
- 'noise' - 将 sys 的噪声部分转换为;
- 'augmented' - 将 sys 的测量部分和噪声部分转换为;
component 仅适用于 sys 是已识别的线性时不变模型的情况。
# 输出参数
sys - 输出系统模型zpk 模型对象 | genss 模型对象 | uss 模型对象
输出系统模型,返回为:
- 零极点增益模型( zpk )对象,当 zeros 、 poles 和 gain 输入参数包含数值时;
- 广义状态空间模型( genss )对象,当 zeros 、 poles 和 gain 输入参数包含可调参数,如 realp 参数或广义矩阵( genmat )时;
- 不确定状态空间模型( uss )对象,当 zeros 、 poles 和 gain 输入参数包含不确定参数。使用不确定模型需要 Robust Control Toolbox 许可。
# 属性
Z - 系统零点cell 数组 | Ny -by- Nu 行向量 cell 数组
系统零点,指定为:
- 单输入单输出模型的传递函数零点或分子根组成的单元数组;
- 一个多输入多输出模型中每个输入输出对的零点行向量组成的 Ny 行 Nu 列单元数组,其中 Ny 为输出数,Nu 为输入数。
Z 的值可以是实数或复数。
P - 系统极点cell 数组 | Ny -by- Nu 行向量 cell 数组
系统极点,指定为:
- 单输入单输出(SISO)模型的传递函数极点或分母根构成的单元数组;
- 多输入多输出(MIMO)模型中每个输入输出(I/O)对的极点构成的行向量的 Ny 行 Nu 列单元数组,其中 Ny 表示输出数,Nu 表示输入数。
P 的值可以是实数或复数。
K - 系统增益标量 | Ny -by- Nu 矩阵
系统增益,指定为:
- 单输入单输出模型中的标量值;
- 一个 Ny 行 Nu 列的矩阵,存储多输入多输出模型中每个输入输出对的增益值,其中 Ny 是输出数,Nu 是输入数。
K 的值可以是实数或复数。
DisplayFormat - 指定分子和分母多项式如何因式分解以供显示'roots' (默认) | 'frequency' | 'time constant'
指定分子和分母多项式如何因式分解以供显示,指定为以下之一:
- 'roots' - 按多项式根的位置显示因子。'roots' 是 DisplayFormat 的默认值;
- 'frequency' - 按根的自然频率 ω 和阻尼比 ζ 显示因子;
- 'frequency' 显示格式对于离散时间模型,当 Variable 值为 'z^-1' 或 'q^-1' 时不可用;
- 'time constant' - 按根的时间常数 τ 和阻尼比 ζ 显示因子。
离散时间模型的 'time constant' 显示格式不适用于具有 Variable 值 'z^-1' 或 'q^-1' 的情况。
对于连续时间模型,下表显示了各种显示格式中多项式因子的排列方式。
| DisplayName 值 | 一阶因子(实根 R) | 二次因子(复根成对 R=a±b) |
|---|---|---|
| 'roots' | ||
| 'frequency' | ||
| 'time constant' |
对于离散时间模型,多项式的因子排列方式与连续时间模型类似,变量替换如下:
其中
Variable - 零极点增益模型显示变量's' (默认) | 'z' | 'p' | 'q' | 'z^-1' | 'q^-1'
零极点增益模型显示变量,指定为以下之一:
- 's' - 连续时间模型的默认值
- 'z' - 离散时间模型的默认值
- 'p' - 等同于 's'
- 'q' - 等同于 'z'
- 'z^-1' - 'z' 的逆元
- 'q^-1' - 等同于 'z^-1'
IODelay - 传输延迟0 (默认)| 标量 | Ny -by- Nu 数组
传输延迟,指定为以下之一:
- 标量 - 为单输入单输出系统指定传输延迟,或为多输入多输出系统的所有输入/输出对指定相同的传输延迟;
- Ny -by- Nu 矩阵 - 为多输入多输出系统的每个输入/输出对指定不同的传输延迟。这里, Ny 是输出的数量, Nu 是输入的数量。
对于连续时间系统,在指定的时间单位(由 TimeUnit 属性指定)中指定传输延迟。对于离散时间系统,在采样时间的整数倍中指定传输延迟 Ts 。
InputDelay - 输入延迟0 (默认)| 标量 | Nu 行 1 列的向量
每个输入通道的输入延迟,指定为以下之一:
- 标量 - 为单输入单输出系统指定输入延迟,或为多输入系统的所有输入指定相同的延迟;
- Nu -维向量 - 为多输入系统的每个输入指定不同的输入延迟,其中 Nu 是输入的数量。
对于连续时间系统,在 TimeUnit 属性指定的时间单位中指定输入延迟。对于离散时间系统,在采样时间 Ts 的整数倍中指定输入延迟。
OutputDelay - 输出延迟0 (默认)| 标量 | Ny 阶向量
每个输出通道的输出延迟,指定为以下之一:
- 标量 - 为单输入单输出系统指定输出延迟,或为多输出系统的所有输出指定相同的延迟;
- Ny -维向量 - 为多输出系统的每个输出指定单独的输出延迟,其中 Ny 是输出的数量。
对于连续时间系统,使用 TimeUnit 属性指定的时间单位来指定输出延迟。对于离散时间系统,使用采样时间 Ts 的整数倍来指定输出延迟。
Ts - 采样时间0 (默认) | 正标量 | -1
指定时间样本,格式为:
- 连续时间系统中的 0 ;
- 表示离散时间系统采样周期的正标量。在 TimeUnit 属性指定的时间单位中指定 Ts ;
- 对于采样周期未指定的离散时间系统,使用 -1 。
更改 Ts 不会离散化或重新采样模型。要转换连续时间表示和离散时间表示,使用 c2d 和 d2c 。要更改离散时间系统的采样时间,使用 d2d 。
TimeUnit - 时间变量单位'seconds' (默认) | 'nanoseconds' | 'microseconds' | 'milliseconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months' | 'years' | ...
时间变量单位,指定为以下之一:
- 'nanoseconds'
- 'microseconds'
- 'milliseconds'
- 'seconds'
- 'minutes'
- 'hours'
- 'days'
- 'weeks'
- 'months'
- 'years'
更改 TimeUnit 不会影响其他属性,但会改变整个系统的运行行为。使用 chgTimeUnit 可以在不修改系统行为的情况下转换时间单位。
InputName - 输入通道名称'' (默认) | 字符向量 | 字符向量单元数组
指定输入通道名称,可以是以下之一:
- 单输入模型的字符向量;
- 多输入模型的字符向量元胞数组;
- '' ,未指定名称,适用于任何输入通道。
或者,您还可以使用自动向量扩展为多输入模型指定输入名称。例如,如果 sys 是两输入模型,请输入以下内容:
sys.InputName = 'controls';
输入的名称会自动扩展为 {'controls(1)';'controls(2)'} 。
你可以使用简写 u 来引用 InputName 属性。例如,sys.u 等同于 sys.InputName 。
使用 InputName 来:
- 在模型显示和图表中标识通道;
- 提取 MIMO 系统的子系统;
- 连接模型时指定连接点。
InputUnit - 输入通道单元'' (默认) | 字符向量 | 字符向量单元数组
指定输入通道单元,可以是以下之一:
- 单输入模型的字符向量;
- 多输入模型的字符向量元胞数组;
- '' 未指定单元,适用于所有输入通道。
使用 InputUnit 指定输入信号单元。InputUnit 不会影响系统行为。
InputGroup - 输入通道组结构体
指定输入通道组,作为结构体。使用 InputGroup 将多输入多输出系统的输入通道分组,并通过名称引用每个组。InputGroup 的字段名是组名,字段值是每个组的输入通道。例如,输入以下内容以创建分别包含输入通道 1 和 2 的 controls 组和包含输入通道 3 和 5 的 noise 组。
sys.InputGroup.controls = [1 2];
sys.InputGroup.noise = [3 5];
你可以使用以下方法从所有输出中提取子系统 controls 的输入:
sys(:, 'controls')
默认情况下, InputGroup 是一个没有字段的结构体。
OutputName - 输出通道名称'' (默认)| 字符串 | 字符串元胞数组
指定输出通道名称,可以是以下之一:
- 单输出模型的字符向量;
- 多输出模型的字符向量元胞数组;
- '' ,未指定名称,适用于任何输出通道。
或者,您还可以使用自动向量扩展为多输出模型指定输出名称。例如,如果 sys 是两输出模型,请输入以下内容。
sys.OutputName = 'measurements';
输出名称会自动扩展为 {'measurements(1)';'measurements(2)'} 。
你也可以使用简写 y 来引用 OutputName 属性。例如,sys.y 等同于 sys.OutputName 。
使用 OutputName 来:
- 在模型显示和图表中标识通道;
- 提取 MIMO 系统的子系统;
- 连接模型时指定连接点;
OutputUnit - 输出通道单元'' (默认)| 字符串 | 字符串元胞数组
指定输出通道单元,可以是以下之一:
- 单输出模型的字符向量;
- 多输出模型的字符向量元胞数组;
- '' ,未指定单元,适用于任何输出通道;
使用 OutputUnit 指定输出信号单元。OutputUnit 不会影响系统行为。
OutputGroup - 输出通道组结构体
输出通道组,指定为结构体。使用 OutputGroup 将多输入多输出系统的输出通道分组,并通过名称引用每个组。 OutputGroup 字段名是组名,字段值是每个组的输出通道。例如,创建名为 temperature 和 measurement 的输出组,分别包含输出通道 1 和 3 以及 5 。
sys.OutputGroup.temperature = [1];
sys.InputGroup.measurement = [3 5];
然后可以使用以下方法从所有输入到 measurement 输出的子系统中提取子系统。
sys('measurement', :)
默认情况下, OutputGroup 是一个没有字段的结构体。
Name - 系统名称'' (默认) | 字符向量
系统名称,指定为字符向量。例如, 'system_1' 。
Notes - 用户指定的文本{} (默认) | 字符向量 | 字符向量单元数组
您想要与系统关联的用户指定文本,指定为字符向量或字符向量元胞数组。例如,'System is MIMO' 。
UserData - 用户指定的数据[] (默认)| 任何 MATLAB 数据类型
您想要与系统关联的用户指定数据,指定为任何 MATLAB 数据类型。
SamplingGrid - 模型数组的采样网格结构体数组
指定为结构数组的模型阵列采样网格
使用 SamplingGrid 来跟踪模型数组中每个模型关联的变量值,包括已识别的线性时不变(IDLTI)模型数组。
将结构的字段名设置为采样变量的名称,将字段值设置为数组中每个模型关联的采样变量值。所有采样变量必须是数值标量,所有采样值数组的维度必须与模型数组的维度匹配。
例如,可以通过在时间点 t = 0:10 处截取线性时变系统的快照来创建一个 11×1 的线性模型数组 sysarr。以下代码将时间采样值与线性模型一起存储。
sysarr.SamplingGrid = struct('time', 0:10)
同样,可以通过独立采样两个变量 zeta 和 w 来创建一个 6×9 的模型数组 M。以下代码将 (zeta,w) 的值映射到 M 。
[zeta, w] = ndgrid(<6 values of zeta>, <9 values of w>)
M.SamplingGrid = struct('zeta', zeta, 'w', w)
当您显示 M 时,数组中的每个条目都包含相应的 zeta 和 w 值。
M
M(:, :, 1, 1) [zeta=0.3, w=5] =
25
--------------
s^2 + 3 s + 25
M(:, :, 2, 1) [zeta=0.35, w=5] =
25
----------------
s^2 + 3.5 s + 25
...
对于通过在多个参数值或操作点处线性化 Simulink 模型生成的模型数组,软件会自动用与数组每个条目对应的变量值填充 SamplingGrid 。
默认情况下,SamplingGrid 是一个没有字段的结构体。
# 对象函数
以下列出了您可以使用 tf 模型的一些代表性函数。一般来说,适用于动态系统模型的任何函数也适用于 tf 对象。
线性分析
控制器设计
# 示例
连续时间单输入单输出零极点增益模型
对于这个示例,考虑以下连续时间单输入单输出零极点增益模型:
指定零点、极点和增益,并创建单输入单输出零极点增益模型。
zeros = 0;
poles = [1-1i 1+1i 2];
gain = -2;
sys = zpk(zeros, poles, gain)
sys =
1.0s
-2.0---------------------------------
(1.0s^2 - 2.0s + 2.0)(1.0s - 2.0)
Delay: 0.0
连续时间传递函数模型
对于示例:
zeros = [];
poles = [-0.25+0.2i;-0.25-0.2i];
gain = 1;
sys = zpk(zeros, poles, gain)
sys =
1.0
1.0-----------------------------------
1.0s^2 + 0.5s + 0.10250000000000001
Delay: 0.0
连续时间传递函数模型
离散时间单输入单输出零极点增益模型
对于这个示例,考虑以下具有 0.1 秒采样时间的离散时间单输入单输出零极点增益模型:
指定零点、极点、增益和采样时间,创建离散时间单输入单输出零极点增益模型。
zeros = [1 2 3];
poles = [6 5 4];
gain = 7;
ts = 0.1;
sys = zpk(zeros, poles, gain, ts)
sys =
(1.0z - 1.0)(1.0z - 2.0)(1.0z - 3.0)
7.0------------------------------------
(1.0z - 6.0)(1.0z - 5.0)(1.0z - 4.0)
Delay: 0.0
Sample Time: 0.1 (seconds)
离散时间传递函数模型
将单输入单输出零极点增益模型连接成多输入多输出零极点增益模型
在这个例子中,通过连接单输入多输出(SISO)零极点增益模型,创建了一个 MIMO 零极点增益模型。考虑以下单输入双输出连续时间零极点增益模型:
通过连接 SISO 条目来指定 MIMO 零极点增益模型。
zeros1 = 1;
poles1 = -1;
gain = 1;
sys1 = zpk(zeros1, poles1, gain)
sys1 =
1.0s - 1.0
1.0----------
1.0s + 1.0
Delay: 0.0
连续时间传递函数模型
zeros2 = -2;
poles2 = [-2+1i -2-1i];
sys2 = zpk(zeros2, poles2, gain)
sys2 =
1.0s + 2.0
1.0-------------------
1.0s^2 + 4.0s + 5.0
Delay: 0.0
连续时间传递函数模型
sys = [sys1;sys2]
sys =
输入 1 到输出 1
1.0s - 1.0
1.0----------
1.0s + 1.0
输入 1 到输出 2
1.0s + 2.0
1.0-------------------
1.0s^2 + 4.0s + 5.0
Delay: 0.0
连续时间传递函数模型
连续时间零极点增益模型(用有理表达式表示)
对于这个示例,使用有理表达式创建一个连续时间零极点增益模型。有时使用有理表达式比指定极点和零点更为简便直观。
考虑以下系统:
要创建传递函数模型,首先将 s 指定为一个 zpk 对象。
s = zpk('s')
s =
s
1-
1
Delay: 0.0
连续时间传递函数模型
使用 s 的有理表达式创建零极点增益模型。
sys = s/(s^2 + 2*s + 10)
sys =
1.0s
1.0-----------------------------------
1.0s^2 + 1.9999999999999996s + 10.0
Delay: 0.0
连续时间传递函数模型
使用有理表达式创建离散时间零极点增益模型
对于这个示例,使用有理表达式创建一个离散时间零极点增益模型。使用有理表达式有时比指定极点和零点更容易且更直观。
考虑以下系统:
要创建零极点增益模型,首先指定 z 作为 zpk 对象,并设置采样时间 ts 。
ts = 0.1;
z = zpk('z', ts)
z =
z
-
1
Delay: 0.0
Sample Time: 0.1 (seconds)
离散时间传递函数模型
sys = (z - 1) / (z^2 - 1.85*z + 0.9)
sys =
1.0z - 1.0
--------------------
1.0z^2 - 1.85z + 0.9
Delay: 0.0
Sample Time: 0.1 (seconds)
离散时间传递函数模型
将状态空间模型转换为零极点增益模型
已知状态空间矩阵:
% 定义状态空间矩阵
A = [-2 -1; 1 -2];
B = [1 1; 2 -1];
C = [1 0];
D = [0 1];
ltiSys = ss(A, B, C, D);
将状态空间模型 ltiSys 转换为零极点增益模型。
sys = zpk(ltiSys);
sys =
从输入 1 到输出:
s
--------------
(s^2 + 4s + 5)
从输入 2 到输出:
(s^2 + 5s + 8)
--------------
(s^2 + 5s + 8)
Continuous-time zero/pole/gain model.
# 算法
zpk 使用函数 roots 将传递函数进行转换,同时使用函数 zero 和 pole 将状态空间模型进行转换。