ss
状态空间模型
说明
使用 ss
可创建实数值或复数值状态空间模型,也可将动态系统模型转换为状态空间模型形式。
状态空间模型是将物理系统表示为一组通过一阶微分方程相关联的输入、输出和状态变量的数学模式。状态变量定义了输出变量的值。ss
模型对象可以表示连续时间或离散时间情况下的 SISO 或 MIMO 状态空间模型。
在连续时间情况下,状态空间模型具有以下形式:
此处,x
、u
和 y
分别表示状态、输入和输出,而 A
、B
、C
和 D
是状态空间矩阵。ss
对象表示 MATLAB® 中的状态空间模型,用于存储 A
、B
、C
和 D
及其他信息,如采样时间、I/O 名称、延迟和偏移量。
您可以通过直接指定状态、输入和输出矩阵,或通过将另一种类型的模型(如传递函数模型 tf
)转换为状态空间形式来创建状态空间模型对象。有关详细信息,请参阅State-Space Models。您可以使用 ss
模型对象执行以下操作:
执行线性分析
表示线性时不变 (LTI) 模型来执行控制设计
与其他 LTI 模型结合使用来表示更复杂的系统
创建对象
语法
描述
可将辨识的线性时不变 (LTI) 模型 sys
= ss(ltiSys
,component
)ltiSys
的指定 component
的被测组件和/或噪声组件转换为 ss
对象。仅当 ltiSys
是辨识的 (LTI) 模型(如 idtf
(System Identification Toolbox)、idss
(System Identification Toolbox)、idproc
(System Identification Toolbox)、idpoly
(System Identification Toolbox) 或 idgrey
(System Identification Toolbox) 对象)时,才使用此语法。
返回最小状态空间实现,其中没有不可控或不可观测的状态。这种实现等效于 sys
= ss(ssSys
,'minimal')minreal(ss(sys))
,其中矩阵 A
具有最小的可能维度。
在 SISO 的情况下,无法唯一定义状态空间形式的转换。在 MIMO 的情况下,也无法保证能够生成最小的实现。有关详细信息,请参阅Recommended Working Representation。
返回动态系统状态空间模型 sys
= ss(ssSys
,'explicit')ssSys
的显式状态空间实现 (E = I)。如果 ssSys
异常,则 ss
将返回错误。有关显式状态空间实现的详细信息,请参阅State-Space Models。
输入参量
A
— 状态矩阵
Nx
×Nx
矩阵
状态矩阵,指定为一个 Nx
×Nx
矩阵,其中 Nx
是状态数。此输入设置属性 A 的值。
B
— 输入-状态矩阵
Nx
×Nu
矩阵
输入-状态矩阵,指定为 Nx
×Nu
矩阵,其中 Nx
是状态数,Nu
是输入数。此输入设置属性 B 的值。
C
— 状态-输出矩阵
Ny
×Nx
矩阵
状态-输出矩阵,指定为 Ny
×Nx
矩阵,其中 Nx
是状态数,Ny
是输出数。此输入设置属性 C 的值。
D
— 馈通矩阵
Ny
×Nu
矩阵
馈通矩阵,指定为 Ny
×Nu
矩阵,其中 Ny
是输出数,Nu
是输入数。此输入设置属性 D 的值。
ts
— 采样时间
标量
采样时间,指定为标量。有关详细信息,请参阅 Ts 属性。
ltiSys
— 要转换为状态空间形式的动态系统
动态系统模型 | 模型数组
要转换为状态空间形式的动态系统,指定为 SISO 或 MIMO 动态系统模型或动态系统模型数组。您可以转换的动态系统包括:
广义或不确定的 LTI 模型,如
genss
或uss
(Robust Control Toolbox) 模型。(使用不确定模型需要 Robust Control Toolbox™ 软件。)生成的状态空间模型假设
可调控制设计模块的可调组件的当前值。
不确定控制设计模块的标称模型值。
辨识的 LTI 模型,如
idtf
(System Identification Toolbox)、idss
(System Identification Toolbox)、idproc
(System Identification Toolbox)、idpoly
(System Identification Toolbox) 和idgrey
(System Identification Toolbox) 模型。要选择要转换的辨识模型的组件,请指定component
。如果未指定component
,则默认情况下,ss
会转换所辨识模型的被测组件。(使用辨识模型需要 System Identification Toolbox™ 软件。)
component
— 所辨识模型的组件
'measured'
(默认) | 'noise'
| 'augmented'
要转换的辨识模型的组件,指定为以下项之一:
'measured'
- 转换sys
的被测组件。'noise'
- 转换sys
的噪声组件'augmented'
- 转换sys
的被测组件和噪声组件。
component
仅在 sys
是辨识的 LTI 模型时适用。
有关辨识的 LTI 模型及其被测组件和噪声组件的详细信息,请参阅Identified LTI Models。
ssSys
— 要转换为最小实现或显式形式的动态系统模型
ss
模型对象
要转换为最小实现或显式形式的动态系统模型,指定为 ss
模型对象。
输出参量
sys
— 输出系统模型
ss
模型对象 | genss
模型对象 | uss
模型对象
输出系统模型,其返回值情况如下:
状态空间 (
ss
) 模型对象(当输入A
、B
、C
和D
是数值矩阵或从另一个模型对象类型转换时)。广义状态空间模型 (
genss
) 对象(当矩阵A
、B
、C
和D
中的一个或多个包括realp
参数等可调参数或广义矩阵 (genmat
) 时)。有关示例,请参阅创建同时具有固定参数和可调参数的状态空间模型。不确定的状态空间模型 (
uss
) 对象(当输入A
、B
、C
和D
中的一个或多个包括不确定的矩阵时)。使用不确定模型需要 Robust Control Toolbox 软件。
属性
A
— 状态矩阵
Nx
×Nx
矩阵
状态矩阵,指定为 Nx
×Nx
矩阵,其中 Nx
是状态数。根据期望的状态空间模型实现,状态矩阵能够以多种方式表示,例如:
模型典型形式
伴随典型形式
可观测的典型形式
可控制的典型形式
有关详细信息,请参阅State-Space Realizations。
B
— 输入-状态矩阵
Nx
×Nu
矩阵
输入-状态矩阵,指定为 Nx
×Nu
矩阵,其中 Nx
是状态数,Nu
是输入数。
C
— 状态-输出矩阵
Ny
×Nx
矩阵
状态-输出矩阵,指定为 Ny
×Nx
矩阵,其中 Nx
是状态数,Ny
是输出数。
D
— 馈通矩阵
Ny
×Nu
矩阵
馈通矩阵,指定为 Ny
×Nu
矩阵,其中 Ny
是输出数,Nu
是输入数。D
也称为静态增益矩阵,表示稳态条件下输出与输入的比率。
E
— 隐式状态空间模型的矩阵
[]
(默认) | Nx
×Nx
矩阵
隐式或描述符形式的状态空间模型的矩阵,指定为 Nx
×Nx
矩阵。E
默认为空,这意味着状态方程为显式方程。要指定隐式状态方程 E dx/dt = Ax + Bu,请将此属性设置为与 A
大小相同的方阵。有关创建描述符形式的状态空间模型的详细信息,请参阅 dss
。
Offsets
— 模型偏移量
[]
(默认) | 结构体
自 R2024a 起
模型偏移量,指定为具有以下字段的结构体。
字段 | 描述 |
---|---|
u | 输入偏移量,指定为长度等于输入数目的向量。 |
y | 输出偏移量,指定为长度等于输出数目的向量。 |
x | 状态偏移量,指定为长度等于状态数目的向量。 |
dx | 状态导数偏移量,指定为长度等于状态数目的向量。 |
对于状态空间模型数组,将 Offsets
设置为与模型数组具有相同维度的结构体数组。
如果您围绕工作点 (x0,u0) 线性化以下非线性模型:
则生成的模型是具有偏移量的状态空间模型:
其中
为了使线性化成为非线性映射的良好逼近,它必须包括偏移量 δ0、x0、u0 和 y0。当使用 StoreOffset
选项时,linearize
(Simulink Control Design) 命令返回 A、B、C、D 和偏移量。
此属性可帮助您管理线性化偏移量并在响应仿真、模型互连和模型变换等操作中使用它们。
Scaled
— 指示是启用还是禁用缩放的逻辑值
0
(默认) | 1
指示是启用还是禁用缩放的逻辑值,指定为 0
或 1
。
当 Scaled
设置为 0
(禁用)时,用于状态空间模型 sys
的大多数数值算法会自动重新调整状态向量以提高数值准确性。您可以通过将 Scaled
设置为 1
(启用)来防止这种自动缩放。
有关缩放的详细信息,请参阅 prescale
。
StateName
— 状态名称
' '
(默认) | 字符向量 | 字符向量元胞数组
状态名称,指定为以下项之一:
字符向量 - 适用于一阶模型,例如
'velocity'
字符向量元胞数组 - 适用于具有两个或多个状态的模型
默认情况下,对于所有状态,StateName
都为空 ' '
。
StatePath
— 状态路径
' '
(默认) | 字符向量 | 字符向量元胞数组
状态路径(便于在线性化过程中管理状态模块路径),指定为以下项之一:
字符向量 - 适用于一阶模型
字符向量元胞数组 - 适用于具有两个或多个状态的模型
默认情况下,对于所有状态,StatePath
都为空 ' '
。
StateUnit
— 状态单位
' '
(默认) | 字符向量 | 字符向量元胞数组
状态单位,指定为以下项之一:
字符向量 - 适用于一阶模型,例如
'm/s'
字符向量元胞数组 - 适用于具有两个或多个状态的模型
使用 StateUnit
跟踪每个状态的单位。StateUnit
对系统行为不起作用。默认情况下,对于所有状态,StateUnit
都为空 ' '
。
InternalDelay
— 模型中的内部延迟
向量
模型中的内部延迟,指定为向量。例如,当闭合具有延迟的系统的反馈环,或串联或并联延迟系统时,就会出现内部延迟。有关内部延迟的详细信息,请参阅Closing Feedback Loops with Time Delays。
对于连续时间模型,内部延迟以模型的 TimeUnit
属性所指定的时间单位表示。对于离散时间模型,内部延迟表示为采样时间 Ts
的整数倍。例如,InternalDelay = 3
表示延迟为三个采样周期。
您可以使用属性 InternalDelay
修改内部延迟的值。但是,sys.InternalDelay
中的条目数无法更改,因为它是模型的结构属性。
InputDelay
— 输入延迟
0
(默认) | 标量 | Nu
×1 向量
每个输入通道的输入延迟,指定为以下项之一:
标量 - 为 SISO 系统指定输入延迟,或为多输入系统的所有输入指定相同的延迟。
Nu
×1 向量 - 为多输入系统的输入指定单独的输入延迟,其中Nu
是输入数。
对于连续时间系统,以 TimeUnit
属性指定的时间单位指定输入延迟。对于离散时间系统,以采样时间 Ts
的整数倍指定输入延迟。
有关详细信息,请参阅Time Delays in Linear Systems。
OutputDelay
— 输出延迟
0
(默认) | 标量 | Ny
×1 向量
每个输出通道的输出延迟,指定为以下项之一:
标量 - 为 SISO 系统指定输出延迟,或为多输出系统的所有输出指定相同的延迟。
Ny
×1 向量 - 为多输出系统的输出指定单独的输出延迟,其中Ny
是输出数。
对于连续时间系统,以 TimeUnit
属性指定的时间单位指定输出延迟。对于离散时间系统,以采样时间 Ts
的整数倍指定输出延迟。
有关详细信息,请参阅Time Delays in Linear Systems。
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
将 MIMO 系统的输入通道分组,并按名称引用每个组。InputGroup
的字段名称是组名称,字段值是每个组的输入通道。例如,输入以下内容以创建名为 controls
和 noise
的输入组,它们分别包括输入通道 1
和 2
以及 3
和 5
。
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
将 MIMO 系统的输出通道分组,并按名称引用每个组。OutputGroup
的字段名称是组名称,字段值是每个组的输出通道。例如,创建名为 temperature
和 measurement
的输出组,它们分别包括输出通道 1
以及 3
和 5
。
sys.OutputGroup.temperature = [1]; sys.OutputGroup.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
。例如,Simulink Control Design™ 命令 linearize
(Simulink Control Design) 和 slLinearizer
(Simulink Control Design) 会自动填充 SamplingGrid
。
默认情况下,SamplingGrid
是不包含字段的结构体。
对象函数
以下列表包含可用于 ss
模型对象的部分代表性函数。一般情况下,任何适用于 动态系统模型 的函数也适用于 ss
对象。
线性分析
step | Step response of dynamic system |
impulse | Impulse response plot of dynamic system; impulse response data |
lsim | Plot simulated time response of dynamic system to arbitrary inputs; simulated response data |
bode | 频率响应或幅值和相位数据的波特图 |
nyquist | Nyquist plot of frequency response |
nichols | Nichols chart of frequency response |
bandwidth | Frequency response bandwidth |
稳定性分析
模型变换
模型互连
示例
SISO 状态空间模型
创建由以下状态空间矩阵定义的 SISO 状态空间模型:
指定 A、B、C 和 D 矩阵,并创建状态空间模型。
A = [-1.5,-2;1,0]; B = [0.5;0]; C = [0,1]; D = 0; sys = ss(A,B,C,D)
sys = A = x1 x2 x1 -1.5 -2 x2 1 0 B = u1 x1 0.5 x2 0 C = x1 x2 y1 0 1 D = u1 y1 0 Continuous-time state-space model.
创建离散时间状态空间模型
使用采样时间 0.25 秒和以下状态空间矩阵创建一个状态空间模型:
指定状态空间矩阵。
A = [0 1;-5 -2]; B = [0;3]; C = [0 1]; D = 0;
指定采样时间。
Ts = 0.25;
创建状态空间模型。
sys = ss(A,B,C,D,Ts);
连续时间 MIMO 状态空间模型
对于此示例,假设有一个立方体绕其角旋转,惯量张量为 J
,阻尼力 F
大小为 0.2。系统的输入是驱动扭矩,而输出是角速度。立方体的状态空间矩阵如下:
指定 A
、B
、C
和 D
矩阵,并创建连续时间状态空间模型。
J = [8 -3 -3; -3 8 -3; -3 -3 8]; F = 0.2*eye(3); A = -J\F; B = inv(J); C = eye(3); D = 0; sys = ss(A,B,C,D)
sys = A = x1 x2 x3 x1 -0.04545 -0.02727 -0.02727 x2 -0.02727 -0.04545 -0.02727 x3 -0.02727 -0.02727 -0.04545 B = u1 u2 u3 x1 0.2273 0.1364 0.1364 x2 0.1364 0.2273 0.1364 x3 0.1364 0.1364 0.2273 C = x1 x2 x3 y1 1 0 0 y2 0 1 0 y3 0 0 1 D = u1 u2 u3 y1 0 0 0 y2 0 0 0 y3 0 0 0 Continuous-time state-space model.
sys
是 MIMO,因为系统包含从矩阵 C
和 D
观测到的 3 个输入和 3 个输出。有关 MIMO 状态空间模型的详细信息,请参阅 MIMO State-Space Models。
离散时间 MIMO 状态空间模型
使用以下离散时间、多输入、多输出状态矩阵和采样时间 ts = 0.2
秒创建一个状态空间模型:
指定状态空间矩阵,并创建离散时间 MIMO 状态空间模型。
A = [-7,0;0,-10]; B = [5,0;0,2]; C = [1,-4;-4,0.5]; D = [0,-2;2,0]; ts = 0.2; sys = ss(A,B,C,D,ts)
sys = A = x1 x2 x1 -7 0 x2 0 -10 B = u1 u2 x1 5 0 x2 0 2 C = x1 x2 y1 1 -4 y2 -4 0.5 D = u1 u2 y1 0 -2 y2 2 0 Sample time: 0.2 seconds Discrete-time state-space model.
指定状态空间模型的状态和输入名称
创建状态空间矩阵,并指定采样时间。
A = [-0.2516 -0.1684;2.784 0.3549]; B = [0;3]; C = [0 1]; D = 0; Ts = 0.05;
创建状态空间模型,使用名称-值对组指定状态和输入名称。
sys = ss(A,B,C,D,Ts,'StateName',{'Position' 'Velocity'},... 'InputName','Force');
状态和输入名称的数目必须与 A
、B
、C
和 D
的维度一致。
在处理 MIMO 系统的响应图时,命名输入和输出可能很有用。
step(sys)
请注意阶跃响应图标题中的输入名称 Force
。
具有继承属性的状态空间模型
对于此示例,创建一个状态空间模型,其中包含从另一个状态空间模型继承的相同时间和输入单位属性。假设有以下状态空间模型:
首先,创建一个状态空间模型 sys1
,将 TimeUnit
和 InputUnit
属性设置为 'minutes
'。
A1 = [-1.5,-2;1,0]; B1 = [0.5;0]; C1 = [0,1]; D1 = 5; sys1 = ss(A1,B1,C1,D1,'TimeUnit','minutes','InputUnit','minutes');
验证 sys1
的时间和输入单位属性是否设置为 'minutes
'。
propValues1 = [sys1.TimeUnit,sys1.InputUnit]
propValues1 = 1x2 cell
{'minutes'} {'minutes'}
使用从 sys1
继承的属性创建第二个状态空间模型。
A2 = [7,-1;0,2]; B2 = [0.85;2]; C2 = [10,14]; D2 = 2; sys2 = ss(A2,B2,C2,D2,sys1);
验证 sys2
的时间和输入单位是否继承自 sys1
。
propValues2 = [sys2.TimeUnit,sys2.InputUnit]
propValues2 = 1x2 cell
{'minutes'} {'minutes'}
MIMO 静态增益状态空间模型
在此示例中,您将创建一个静态增益 MIMO 状态空间模型。
假设有以下双输入双输出静态增益矩阵:
指定增益矩阵并创建静态增益状态空间模型。
D = [2,4;3,5]; sys1 = ss(D)
sys1 = D = u1 u2 y1 2 4 y2 3 5 Static gain.
将传递函数转换为状态空间模型
计算以下传递函数的状态空间模型:
创建传递函数模型。
H = [tf([1 1],[1 3 3 2]) ; tf([1 0 3],[1 1 1])];
将此模型转换为状态空间模型。
sys = ss(H);
检查状态空间模型的大小。
size(sys)
State-space model with 2 outputs, 1 inputs, and 5 states.
状态数等于 H(s) 中 SISO 条目的累积阶数。
要获得 H(s) 的最小实现,请输入
sys = ss(H,'minimal');
size(sys)
State-space model with 2 outputs, 1 inputs, and 3 states.
生成的模型的阶数为 3,这是表示 H(s) 所需的最小状态数。要查看此状态数,请将 H(s) 重构为一阶方程组和二阶方程组的乘积。
从辨识的模型中提取状态空间模型
对于此示例,将辨识的多项式模型的被测组件和噪声组件提取为两个单独的状态空间模型。
在 identifiedModel.mat
中加载博克斯-詹金斯多项式模型 ltiSys
。
load('identifiedModel.mat','ltiSys');
ltiSys
是辨识的离散时间模型,其形式为:,其中 表示被测组件, 表示噪声组件。
将被测组件和噪声组件提取为状态空间模型。
sysMeas = ss(ltiSys,'measured')
sysMeas = A = x1 x2 x1 1.575 -0.6115 x2 1 0 B = u1 x1 0.5 x2 0 C = x1 x2 y1 -0.2851 0.3916 D = u1 y1 0 Input delays (sampling periods): 2 Sample time: 0.04 seconds Discrete-time state-space model.
sysNoise = ss(ltiSys,'noise')
sysNoise = A = x1 x2 x3 x1 1.026 -0.26 0.3899 x2 1 0 0 x3 0 0.5 0 B = v@y1 x1 0.25 x2 0 x3 0 C = x1 x2 x3 y1 0.319 -0.04738 0.07106 D = v@y1 y1 0.04556 Input groups: Name Channels Noise 1 Sample time: 0.04 seconds Discrete-time state-space model.
被测组件可以用作被控对象模型,而噪声组件可以用作控制系统设计的扰动模型。
描述符形式的状态空间模型的显式实现
创建描述符形式的状态空间模型 (E ≠ I)。
a = [2 -4; 4 2]; b = [-1; 0.5]; c = [-0.5, -2]; d = [-1]; e = [1 0; -3 0.5]; sysd = dss(a,b,c,d,e);
计算系统 (E = I) 的显式实现。
syse = ss(sysd,'explicit')
syse = A = x1 x2 x1 2 -4 x2 20 -20 B = u1 x1 -1 x2 -5 C = x1 x2 y1 -0.5 -2 D = u1 y1 -1 Continuous-time state-space model.
确认描述符和显式实现具有等效的动态特性。
bodeplot(sysd,syse,'g--')
创建同时具有固定参数和可调参数的状态空间模型
此示例说明如何创建同时具有固定参数和可调参数的状态空间 genss
模型。
其中 a 和 b 是可调参数,其初始值分别为 -1
和 3
。
使用 realp
创建可调参数。
a = realp('a',-1); b = realp('b',3);
使用 a
和 b
的代数表达式定义一个广义矩阵。
A = [1 a+b;0 a*b];
A
是一个广义矩阵,其 Blocks
属性包含 a
和 b
。A
的初始值是 [1 2;0 -3]
,来自 a
和 b
的初始值。
创建固定值状态空间矩阵。
B = [-3.0;1.5]; C = [0.3 0]; D = 0;
使用 ss
创建状态空间模型。
sys = ss(A,B,C,D)
Generalized continuous-time state-space model with 1 outputs, 1 inputs, 2 states, and the following blocks: a: Scalar parameter, 2 occurrences. b: Scalar parameter, 2 occurrences. Type "ss(sys)" to see the current value and "sys.Blocks" to interact with the blocks.
sys
是一个广义 LTI 模型 (genss
),具有可调参数 a
和 b
。
具有输入和输出延迟的状态空间模型
对于此示例,假设有一个由以下状态空间矩阵定义的 SISO 状态空间模型:
假设以 0.5 秒的输入延迟和 2.5 秒的输出延迟,创建一个状态空间模型对象来表示 A、B、C 和 D 矩阵。
A = [-1.5,-2;1,0]; B = [0.5;0]; C = [0,1]; D = 0; sys = ss(A,B,C,D,'InputDelay',0.5,'OutputDelay',2.5)
sys = A = x1 x2 x1 -1.5 -2 x2 1 0 B = u1 x1 0.5 x2 0 C = x1 x2 y1 0 1 D = u1 y1 0 Input delays (seconds): 0.5 Output delays (seconds): 2.5 Continuous-time state-space model.
您还可以使用 get
命令来显示 MATLAB 对象的所有属性。
get(sys)
A: [2x2 double] B: [2x1 double] C: [0 1] D: 0 E: [] Offsets: [] Scaled: 0 StateName: {2x1 cell} StatePath: {2x1 cell} StateUnit: {2x1 cell} InternalDelay: [0x1 double] InputDelay: 0.5000 OutputDelay: 2.5000 InputName: {''} InputUnit: {''} InputGroup: [1x1 struct] OutputName: {''} OutputUnit: {''} OutputGroup: [1x1 struct] Notes: [0x1 string] UserData: [] Name: '' Ts: 0 TimeUnit: 'seconds' SamplingGrid: [1x1 struct]
有关为 LTI 模型指定时滞的详细信息,请参阅Specifying Time Delays。
状态空间系统的稳定性分析
对于此示例,假设有一个表示以下状态矩阵的状态空间 System object™:
使用 ss
命令创建一个状态空间对象 sys
。
A = [-1.2,-1.6,0;1,0,0;0,1,0]; B = [1;0;0]; C = [0,0.5,1.3]; D = 0; sys = ss(A,B,C,D);
接下来,计算一个单位负增益的闭环状态空间模型,并找到闭环状态空间系统对象 sysFeedback
的极点。
sysFeedback = feedback(sys,1); P = pole(sysFeedback)
P = 3×1 complex
-0.2305 + 1.3062i
-0.2305 - 1.3062i
-0.7389 + 0.0000i
单位增益的反馈环是稳定的,因为所有极点都具有负实部。通过检查闭环极点,可对稳定性进行二元评估。实际上,了解稳健性有多强(或多弱)更有用。稳健性的一个标志是在失去稳定性之前环路增益会变化多少。您可以使用根轨迹图来估计环路处于稳定状态时的 k
值的范围。
rlocus(sys)
环路增益的变化只是稳健性的一个方面。一般情况下,如果被控对象建模不完善,则意味着增益和相位都无法精确得知。由于建模误差在增益穿越频率(开环增益为 0dB 的频率)附近的不利影响最严重,因此在此频率下可以容忍多大的相位变化也很重要。
您可以在波特图上显示增益和相位裕度,如下所示。
bode(sys) grid
有关更详细的示例,请参阅Assessing Gain and Phase Margins。
使用状态空间模型的控制设计
对于此示例,为以下矩阵表示的系统设计一个目标带宽为 0.75 弧度/秒的二自由度 PID 控制器:
使用 ss
命令创建一个状态空间对象 sys
。
A = [-0.5,-0.1;1,0]; B = [1;0]; C = [0,1]; D = 0; sys = ss(A,B,C,D)
sys = A = x1 x2 x1 -0.5 -0.1 x2 1 0 B = u1 x1 1 x2 0 C = x1 x2 y1 0 1 D = u1 y1 0 Continuous-time state-space model.
使用目标带宽,通过 pidtune
生成一个二自由度控制器。
wc = 0.75;
C2 = pidtune(sys,'PID2',wc)
C2 = 1 u = Kp (b*r-y) + Ki --- (r-y) + Kd*s (c*r-y) s with Kp = 0.513, Ki = 0.0975, Kd = 0.577, b = 0.344, c = 0 Continuous-time 2-DOF PID controller in parallel form.
使用类型 'PID2'
会导致 pidtune
生成一个二自由度控制器,表示为 pid2
对象。显示画面确认了此结果。显示画面还说明 pidtune
可调节所有控制器系数,包括设定值权重 b
和 c
,以平衡性能和稳健性。
有关实时编辑器中的交互式 PID 调节,请参阅Tune PID Controller实时编辑器任务。此任务用于以交互方式设计 PID 控制器,并为实时脚本自动生成 MATLAB 代码。
对于独立 App 中的交互式 PID 调节,请使用 PID 调节器。有关使用该 App 设计控制器的示例,请参阅用于快速参考跟踪的 PID 控制器设计。
在反馈环中连接状态空间模型的特定输入和输出
假设有一个具有五个输入与四个输出的状态空间被控对象 G
和一个具有三个输入与两个输出的状态空间反馈控制器 K
。被控对象 G
的输出 1、3 和 4 必须连接到控制器 K
的输入,并且该控制器的输出连接到该被控对象的输入 4 和 2。
对于此示例,假设有两个由下面一组矩阵表示的 G
和 K
的连续时间状态空间模型:
AG = [-3,0.4,0.3;-0.5,-2.8,-0.8;0.2,0.8,-3]; BG = [0.4,0,0.3,0.2,0;-0.2,-1,0.1,-0.9,-0.5;0.6,0.9,0.5,0.2,0]; CG = [0,-0.1,-1;0,-0.2,1.6;-0.7,1.5,1.2;-1.4,-0.2,0]; DG = [0,0,0,0,-1;0,0.4,-0.7,0,0.9;0,0.3,0,0,0;0.2,0,0,0,0]; sysG = ss(AG,BG,CG,DG)
sysG = A = x1 x2 x3 x1 -3 0.4 0.3 x2 -0.5 -2.8 -0.8 x3 0.2 0.8 -3 B = u1 u2 u3 u4 u5 x1 0.4 0 0.3 0.2 0 x2 -0.2 -1 0.1 -0.9 -0.5 x3 0.6 0.9 0.5 0.2 0 C = x1 x2 x3 y1 0 -0.1 -1 y2 0 -0.2 1.6 y3 -0.7 1.5 1.2 y4 -1.4 -0.2 0 D = u1 u2 u3 u4 u5 y1 0 0 0 0 -1 y2 0 0.4 -0.7 0 0.9 y3 0 0.3 0 0 0 y4 0.2 0 0 0 0 Continuous-time state-space model.
AK = [-0.2,2.1,0.7;-2.2,-0.1,-2.2;-0.4,2.3,-0.2]; BK = [-0.1,-2.1,-0.3;-0.1,0,0.6;1,0,0.8]; CK = [-1,0,0;-0.4,-0.2,0.3]; DK = [0,0,0;0,0,-1.2]; sysK = ss(AK,BK,CK,DK)
sysK = A = x1 x2 x3 x1 -0.2 2.1 0.7 x2 -2.2 -0.1 -2.2 x3 -0.4 2.3 -0.2 B = u1 u2 u3 x1 -0.1 -2.1 -0.3 x2 -0.1 0 0.6 x3 1 0 0.8 C = x1 x2 x3 y1 -1 0 0 y2 -0.4 -0.2 0.3 D = u1 u2 u3 y1 0 0 0 y2 0 0 -1.2 Continuous-time state-space model.
根据反馈环中要连接的输入和输出,定义 feedout
和 feedin
向量。
feedin = [4 2]; feedout = [1 3 4]; sys = feedback(sysG,sysK,feedin,feedout,-1)
sys = A = x1 x2 x3 x4 x5 x6 x1 -3 0.4 0.3 0.2 0 0 x2 1.18 -2.56 -0.8 -1.3 -0.2 0.3 x3 -1.312 0.584 -3 0.56 0.18 -0.27 x4 2.948 -2.929 -2.42 -0.452 1.974 0.889 x5 -0.84 -0.11 0.1 -2.2 -0.1 -2.2 x6 -1.12 -0.26 -1 -0.4 2.3 -0.2 B = u1 u2 u3 u4 u5 x1 0.4 0 0.3 0.2 0 x2 -0.44 -1 0.1 -0.9 -0.5 x3 0.816 0.9 0.5 0.2 0 x4 -0.2112 -0.63 0 0 0.1 x5 0.12 0 0 0 0.1 x6 0.16 0 0 0 -1 C = x1 x2 x3 x4 x5 x6 y1 0 -0.1 -1 0 0 0 y2 -0.672 -0.296 1.6 0.16 0.08 -0.12 y3 -1.204 1.428 1.2 0.12 0.06 -0.09 y4 -1.4 -0.2 0 0 0 0 D = u1 u2 u3 u4 u5 y1 0 0 0 0 -1 y2 0.096 0.4 -0.7 0 0.9 y3 0.072 0.3 0 0 0 y4 0.2 0 0 0 0 Continuous-time state-space model.
size(sys)
State-space model with 4 outputs, 5 inputs, and 6 states.
sys
是通过连接 G
和 K
的指定输入和输出获得的最终闭环状态空间模型。
创建带偏移量的状态空间模型
自 R2024a 起
此示例说明如何线性化 Simulink® 模型并将线性化偏移量存储在 ss
模型对象的 Offsets
属性中。
打开 Simulink 模型。
mdl = 'watertankNLModel';
open_system(mdl)
指定水位的初始条件。
h0 = 10;
指定模型线性分析点。
io(1) = linio('watertankNLModel/Step',1,'input'); io(2) = linio('watertankNLModel/H',1,'output');
对模型进行仿真并提取时间快照上的工作点。
tlin = [0 15 30]; op = findop(mdl,tlin);
计算线性化结果和偏移量。
options = linearizeOptions('StoreOffsets',true);
[linsys,~,info] = linearize(mdl,io,op,options);
该函数返回一个状态空间模型数组 linsys
及其中的模型在 info.Offsets
中对应的线性化偏移量。
ss
模型对象的 Offsets
属性需要一个具有字段 u
、y
、x
和 dx
的结构体。您可以使用来自 linearize
的 info.Offsets
输出直接设置这些偏移量。
linsys.Offsets = info.Offsets; linsys.Offsets
ans=3×1 struct array with fields:
dx
x
u
y
版本历史记录
在 R2006a 之前推出R2024a: 创建带偏移量的状态空间模型
使用新 Offsets
属性存储模型偏移量。在某些工况下,对非线性动态进行线性化时,通常会产生偏移量。此属性可帮助您管理线性化偏移量并在响应仿真、模型互连和模型变换等操作中使用它们。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)