# impulse
动态系统的冲激响应图;冲激响应数据
# 语法
impulse(sys)
impulse(sys,Tfinal)
impulse(sys,t)
impulse(sys1,sys2,...,sysN)
impulse(sys1,sys2,...,sysN,Tfinal)
impulse(sys1, sys2, ..., sysN, t)
[y, t] = impulse(sys)
[y, t] = impulse(sys, Tfinal)
[y, t] = impulse(sys, t)
[y, t, x] = impulse(sys)
[y, t, x, ysd] = impulse(sys)
# 说明
impulse(sys) 绘制了动态系统模型对单位振幅脉冲输入的响应。模型系统可以是连续的或离散的,也可以是 SISO 或 MIMO。对于 MIMO 系统,该图显示每个 I/O 信道的脉冲响应。impulse 基于系统动力学自动确定仿真的时间步长和持续时间。
impulse(sys,Tfinal) 从 t = 0 到最终时间 t = Tfinal 的脉冲响应。该函数使用系统动力学来确定中间时间步长。
impulse(sys,t) 绘制在向量 t 指定时刻的脉冲响应。
impulse(sys1,sys2,...,sysN) 在同一张图上绘制了多个动态系统 sys1,sys2,...,sysN 的脉冲响应图。所有系统必须具有相同数量的输入和输出才能使用此语法。
[y, t] = impulse(sys) 计算动态系统的冲击响应 y 。时间向量 sys 以 tOut 的时间单位表示。 sys 会根据系统动力学自动确定时间步长和仿真持续时间。
[y, t] = impulse(sys, Tfinal) 从 t = 0 计算到结束时间 t = Tfinal 的冲击响应。
[y, t] = impulse(sys, t) 返回动态系统模型在指定时间向量 sys 中的冲击响应。
[y, t, x] = impulse(sys) 还返回状态轨迹 x ,当 sys 是状态空间模型,如 ss 或 idss 模型时。
[y, t, x, ysd] = impulse(sys) 还计算了冲击响应的标准差,当 ysd 是一个被识别的模型,如 y 、 sys 或 idss 模型时。
# 示例
动态系统的冲激响应
绘制以下传递函数表示的连续时间系统的冲激响应。
对于这个示例,创建一个 tf 模型来表示传递函数。你也可以类似地绘制其他动态系统模型类型的冲激响应,例如零极点增益(zpk)或状态空间(ss)模型。
sys = tf(4, [1 2 10]);
绘制冲激响应。
impulse(sys)
impulse 图自动包含一条虚线水平线,表示稳态响应。
离散时间系统冲激响应
绘制离散时间系统的冲激响应。该系统采样时间为 0.2 秒,由以下状态空间矩阵表示。
A = [1.6 -0.7;
1 0];
B = [0.5; 0];
C = [0.1 0.1];
D = 0;
创建状态空间模型并绘制其冲激响应。
sys = ss(A, B, C, D, 0.2);
impulse(sys)
冲激响应反映了模型的离散化情况,因为它显示了每隔 0.2 秒计算得到的响应。
指定时间点的冲激响应
检查以下零极点增益模型的脉冲响应。
sys = zpk(-1, [-0.2+3j, -0.2-3j], 1) * tf([1 1], [1 0.05])
sys =
(1.0s + 1.0)(1.0s + 1.0)
1.0-----------------------------------
(1.0s^2 + 0.4s + 9.04)(1.0s + 0.05)
Delay: 0.0
连续时间传递函数模型
impulse(sys)
默认情况下, impulse 会选择一个结束时间,以显示响应趋近的稳态。为了更详细地观察瞬态响应,可以将脉冲图限制在 t = 20 s。
impulse(sys, 20)
或者,你可以指定你想要检查脉冲响应的确切时间,前提是这些时间间隔是恒定的。例如,从瞬态结束到系统达到稳态,检查响应。
t = 20:0.2:120;
impulse(sys, t)
尽管这个图从 t = 20 开始,但 impulse 始终会在 t = 0 时刻施加脉冲输入。
比较两个或多个系统模型的脉冲响应
考虑以下两个系统模型:
% 创建两个不同的传递函数模型
sys1 = tf([1], [1 2 1]); % 系统1: H(s) = 1/(s^2 + 2s + 1)
sys2 = tf([1 1], [1 8 3 1]); % 系统2: H(s) = (s + 1)/(s^3 + 8s^2 + 3s + 1)
% 在同一图形窗口中绘制两个系统的脉冲响应
figure;
impulse(sys1, sys2);
% 添加图例和标题
legend('二阶系统', '三阶系统');
title('两个系统的脉冲响应比较');
grid on;

MIMO 系统的冲激响应图
考虑以下二阶状态空间模型:
A = [-0.5572, -0.7814;0.7814, 0];
B = [1, -1;0, 2];
C = [1.9691, 6.4493];
sys = ss(A, B, C, 0);
该模型有两个输入和一个输出,因此有两个通道:从第一个输入到输出的通道和从第二个输入到输出的通道。每个通道都有自己的冲激响应。
当你使用 impulse 时,它会计算所有通道的响应。
impulse(sys)
左图显示了第一个输入通道的冲激响应,右图显示了第二个输入通道的冲激响应。
模型阵列中系统的冲激响应
示例《比较多个系统的时间响应》展示了如何在同一坐标轴上绘制多个独立系统的响应。
创建一个模型数组。对于这个示例,使用一个一维数组的二阶传递函数,这些传递函数具有不同的固有频率。首先,为模型数组分配内存。以下命令创建一个包含 5 个零增益单输入单输出(SISO)传递函数的一行。前两个维度表示模型的输出和输入,其余维度是数组的维度。
w0 = 1.5:1:5.5; % 自然频率
zeta = 0.5; % 阻尼系数
figure;
hold on; % 保持当前图形
for i = 1:length(w0)
sys = tf(w0(i)^2, [1 2*zeta*w0(i) w0(i)^2]);
impulse(sys);
end
grid on;
title('多个二阶系统的脉冲响应');
legend(arrayfun(@(i) sprintf('w0=%.1f', w0(i)), 1:length(w0), 'UniformOutput', false));
hold off;

冲激响应数据
当你给它一个输出参数时,impulse 返回一个响应数据数组。对于单输入单输出系统,响应数据将以与采样时间点数量相等的列向量形式返回。你可以提供时间点向量 t,或者允许 impulse 根据系统动态为你选择时间点。例如,在 t = 0 到 t = 5 秒之间,提取单输入单输出系统的脉冲响应,采样 101 个时间点。
sys = tf(4, [1 2 10]);
t = 0:0.05:5;
y = impulse(sys, t);
size(y)
ans =
101 1
对于多输入多输出系统,响应数据以 N-by-Ny-by-Nu 维数的数组形式返回,其中 Ny 和 Nu 分别是动态系统的输出数和输入数。例如,考虑以下状态空间模型,它表示一个两输入一输出系统。
A = [-0.5572, -0.7814;0.7814, 0];
B = [1, -1;0, 2];
C = [1.9691, 6.4493];
sys = ss(A, B, C, 0);
在 t = 0 到 t = 20 秒之间,提取该系统的 200 个时间点的脉冲响应。
t = linspace(0, 20, 200);
y = impulse(sys, t);
size(y)
ans =
200 1 2
y(:, i, j) 是一个列向量,包含第 i 个输入到第 j 个输出在时间 t 的脉冲响应。例如,提取第二个输入到输出的脉冲响应。
y12 = y(:, 1, 2);
plot(t, y12)

# 输入参数
sys - 动态系统 动态系统模型 | 模型数组
指定动态系统,作为单输入单输出(SISO)或多输入多输出(MIMO)动态系统模型或动态系统模型数组。您可以使用的动态系统包括:
- 连续时间或离散时间的数值 LTI 模型,如 tf 、 zpk 或 ss 模型;
- 广义或不确定的 LTI 模型,如 genss 或 uss 模型;
- 对于可调控制设计块,该函数会在绘图和返回响应数据时评估模型的当前值;
- 对于不确定控制设计块,该函数会绘制模型的名义值和随机样本。当使用输出参数时,该函数仅返回名义模型的响应数据。
- 稀疏状态空间模型,如 sparss 和 mechss 模型。对于稀疏状态空间模型,必须指定最终时间 Tfinal ;
- 已识别的线性时不变(LTI)模型,如 idtf 、 idss 或 idproc 模型。对于此类模型,该函数还可以绘制置信区间并返回频率响应的标准差(使用已识别模型需要 System Identification Toolbox™ 软件);
- 线性时变(LTV)和线性参数变(LPV)模型。
impulse 不支持频率响应数据模型,如 frd 、 genfrd 或 idfrd 模型。
Tfinal - 冲激响应结束时间 正标量
指定脉冲响应结束时间,以正标量值表示。 impulse 模拟从 t = 0 到 t = 的脉冲响应 Tfinal 。
- 对于连续时间系统,该函数会根据系统动力学自动确定步长和点数。使用 Tfinal 在系统时间单位中表示,这些单位由 TimeUnit 属性中的 sys 指定;
- 对于离散时间系统,该函数使用 sys 的采样时间作为步长。使用 Tfinal 在系统时间单位中表示,这些单位由 TimeUnit 属性中的 sys 指定;
- 对于未指定采样时间的离散时间系统( Ts = -1 ),impulse 将 Tfinal 解释为模拟的采样周期数。
[t0, Tfinal] - 冲击响应时间范围 二元向量
冲击响应的时间范围,指定为两个正标量值的二元向量。 impulse 模拟从 t = t0 到 t = Tfinal 的响应。
如果您已使用 RespConfig 指定了冲击延迟 td ,函数将在 t = t0 + td 时刻应用冲击。
t - 时间向量 vector
要在哪个时间向量上计算冲击响应,指定为正标量值向量。时间 t 表示系统时间单位,由 TimeUnit 属性指定 sys 。
- 对于连续时间模型,在形式 T0:dt:Tf 中指定 t。为了在每个时间步获得响应,该函数使用 dt 作为连续系统离散近似的时间采样间隔。仿真从 T0 开始,在 Tf 结束;
- 对于离散时间模型,在形式 T0:Ts:Tf 中指定 t,其中 Ts 是 sys 的时间采样间隔。
p - LPV 模型参数轨迹 矩阵 | 函数句柄
LPV 模型的参数轨迹,指定为矩阵或函数句柄。
- 对于外生或显式轨迹,指定 p 作为 N-by-Np 的矩阵,其中 N 是时间样本数,Np 是参数数。因此,行向量 p(i, :) 包含第 k 个时间步的参数值;
- 对于内生或隐式轨迹,指定 p 作为形式为 p = F(k, x, u) 的函数句柄,该函数给出参数是时间样本 k、状态 x 和输入 u 的函数。 impulse 只支持这种选项用于离散时间的 LPV 模型。此选项在您希望模拟准 LPV 模型时非常有用。
# 输出参数
y - 冲击响应数据 数组
冲激响应数据,返回为一个数组。
- 对于单输入单输出系统, y 是一个列向量,其长度与提供的 t 相同,或者与未提供的 tOut 相同;
- 对于单输入多输出系统, y 是一个矩阵,其行数等于时间样本数,列数等于输出数。因此, y 的第 j 列,或者 y(:,j) 的第 j 列,包含从第 j 个输入到第 j 个输出的冲激响应;
- 对于多输入多输出系统,每个输入通道的冲激响应沿 y 的第三维度堆叠。 y 的维度是 N-by-Ny-by-Nu,其中:
- N 是时间样本数;
- Ny 是系统输出的数量;
- Nu 是系统输入的数量。
因此,y(:, i, j) 是一个列向量,包含在 t 或 tOut 指定的时间点上,从第 Nu 个输入到第 Ny 个输出的冲激响应。
tOut - 冲击响应计算的时间 向量
计算冲击响应的时间点,以向量形式返回。如果不提供具体的时间向量,则由系统动力学自动选择该时间向量。时间单位为 sys 中指定的单位。
x - 状态轨迹 数组
状态轨迹,返回为一个数组。当 sys 是一个状态空间模型时, x 包含 sys 在 t 或 tOut 中的每个时间点的状态演变。 x 的维度为 N-by-Nx-by-Nu,其中:
- N 是时间样本数;
- Nx 是状态的数量;
- Nu 是系统输入的数量。
因此,在第 k 个输入处注入脉冲后,状态的演变由数组 x(:, :, k) 给出。行向量 x(i, :, k) 包含第 th 个时间步的状态值。
ysd - 冲击响应的标准差 数组
已识别模型的脉冲响应的标准差,返回为与 y 相同维度的数组。如果 sys 不包含参数协方差信息,则 ysd 为空。
pOut - 参数轨迹 数组
参数轨迹,返回为一个数组。当 sys 是一个线性参数变化模型时, pOut 包含 sys 在 t 或 tOut 中的每个时间点的参数演变。pOut 的维度为 N-by-Np-by-Nu,其中:
- N 是时间样本数;
- Np 是参数的数量;
- Nu 是系统输入的数量。
因此,当在第 k 个输入处注入信号时,参数的变化由数组 pOut(:, :, k) 给出。行向量 pOut(i, :, k) 包含第 th 个时间步的参数值。
# 限制
具有非零 D 矩阵的连续系统在
# 提示
您可以更改绘图属性,例如单位。
# 算法
连续时间模型首先转换为状态空间模型。单输入状态空间模型的冲激响应为
等价于以下无外力作用的初始状态为 b 的响应。
要模拟此响应,系统会使用零阶保持器对输入进行离散化。采样时间会根据系统动力学自动选择,除非提供了时间向量 t = 0:dt:Tf (此时使用 dt 作为采样时间)。