2026a
M 语言

# 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 矩阵的连续系统在 处的脉冲响应是无穷大的。 impulse 忽略了这一不连续性,并在 处返回较低连续值

# 提示

您可以更改绘图属性,例如单位。

# 算法

连续时间模型首先转换为状态空间模型。单输入状态空间模型的冲激响应为

等价于以下无外力作用的初始状态为 b 的响应。

要模拟此响应,系统会使用零阶保持器对输入进行离散化。采样时间会根据系统动力学自动选择,除非提供了时间向量 t = 0:dt:Tf (此时使用 dt 作为采样时间)。

# 另请参阅

step | initial | lsim