主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

impulse

动态系统的冲激响应图;冲激响应数据

    说明

    [y,tOut] = impulse(sys) 计算动态系统 sys 的冲激响应 yimpulse 根据系统动态特性自动确定仿真的时间步和持续时间。

    [y,tOut] = impulse(sys,t)t 指定的时间步对响应进行仿真。要定义时间步,您可以:

    • 使用标量值指定最终仿真时间。

    • 使用二元素向量指定初始仿真时间和最终仿真时间。 (自 R2023b 起)

    • 使用向量指定所有时间步。

    [y,tOut] = impulse(sys,t,p) 指定线性参数变化 (LPV) 模型的参数轨迹 p (自 R2023a 起)

    sys 是状态空间模型时,[y,t,x] = impulse(___) 还返回状态轨迹 x

    示例

    [y,t,x,ysd] = impulse(___) 返回辨识模型的冲激响应的标准差。

    示例

    [y,tOut,x,~,pOut] = impulse(sys,t,p) 返回 LPV 模型的参数轨迹。 (自 R2023a 起)

    [y,tOut] = impulse(___,config) 指定用于计算冲激响应的其他选项,例如振幅或输入偏移量。使用 RespConfig 创建选项集 config

    示例

    impulse(___) 使用所有先前输入参量组合的默认绘图选项绘制 sys 的冲激响应。如需更多绘图自定义选项,请使用 impulseplot

    • 要在同一图上绘制多个动态系统的响应,您可以将 sys 指定为以逗号分隔的模型列表。例如,impulse(sys1,sys2,sys3) 在同一图上绘制三个模型的响应。

    • 要为图中的每个系统分别指定一种颜色、线型和标记,请为每个系统指定 LineSpec 值。例如,impulse(sys1,LineSpec1,sys2,LineSpec2) 绘制两个模型并指定它们的绘图样式。有关指定 LineSpec 值的详细信息,请参阅 impulseplot

    示例

    全部折叠

    绘制由以下传递函数表示的连续时间系统的冲激响应。

    sys(s)=4s2+2s+10

    对于此示例,请创建一个表示传递函数的 tf 模型。同样,您可以绘制其他动态系统模型类型的冲激响应,例如零极点增益 (zpk) 模型或状态空间 (ss) 模型。

    sys = tf(4,[1 2 10]);

    绘制冲激响应。

    impulse(sys)

    MATLAB figure

    impulse 图自动包含一条水平点线,指示稳态响应。在 MATLAB® 图窗窗口中,您可以右键点击绘图以查看其他冲激响应特征,例如峰值响应和瞬态时间。

    绘制一个离散时间系统的冲激响应。该系统的采样时间为 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)

    MATLAB figure

    冲激响应反映了模型的离散化,因为它显示的是每 0.2 秒计算一次的响应。

    检查以下零极点增益模型的冲激响应。

    sys = zpk(-1,[-0.2+3j,-0.2-3j],1) * tf([1 1],[1 0.05]) 
    sys =
     
                (s+1)^2
      ----------------------------
      (s+0.05) (s^2 + 0.4s + 9.04)
     
    Continuous-time zero/pole/gain model.
    Model Properties
    
    impulse(sys)

    MATLAB figure

    默认情况下,impulse 会选择一个结束时间,在该时间处显示响应趋向的稳定状态。为了更仔细地观察瞬态响应,请将冲激图限制在 t = 20 秒。

    impulse(sys,20)

    MATLAB figure

    您也可以指定要检查冲激响应的确切时间,前提是这些时间之间有恒定的区间。例如,检查从瞬态结束到系统达到稳定状态的响应。

    t = 20:0.2:120;
    impulse(sys,t)

    MATLAB figure

    尽管此图从 t = 20 开始,但 impulse 始终在 t = 0 处应用冲激输入。

    假设有以下二阶状态空间模型:

    [x˙1x˙2]=[-0.5572-0.78140.78140][x1x2]+[1-102][u1u2]y=[1.96916.4493][x1x2]

    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)

    MATLAB figure

    左图显示了第一个输入通道的冲激响应,右图显示了第二个输入通道的冲激响应。每当您使用 impulse 绘制 MIMO 模型的响应时,它都会生成一个绘图数组,表示该模型的所有 I/O 通道。例如,创建一个具有五个状态、三个输入和两个输出的随机状态空间模型,并绘制其冲激响应。

    sys = rss(5,2,3);
    impulse(sys)

    MATLAB figure

    在 MATLAB 图窗窗口中,您可以右键点击绘图并选择 I/O Selector,将绘图限制为通道的子集。

    使用 impulse,您可以在同一轴上绘制多个动态系统的响应。例如,将系统的闭环响应与 PI 控制器和 PID 控制器的闭环响应进行比较。创建系统的传递函数并调节控制器。

    H = tf(4,[1 2 10]);
    C1 = pidtune(H,'PI');
    C2 = pidtune(H,'PID');

    形成闭环系统并绘制其冲激响应。

    sys1 = feedback(H*C1,1);
    sys2 = feedback(H*C2,1);
    impulse(sys1,sys2)
    legend('PI','PID','Location','SouthEast')

    MATLAB figure

    默认情况下,impulse 会为您绘制的每个系统选择不同的颜色。您可以使用 LineSpec 输入参量指定颜色和线型。

     impulse(sys1,'r--',sys2,'b')
     legend('PI','PID','Location','SouthEast')

    MATLAB figure

    第一个 LineSpec 'r--' 为 PI 控制器的响应指定红色虚线。第二个 LineSpec 'b' 为 PID 控制器的响应指定蓝色实线。图例反映了所指定的颜色和线型。如需更多绘图自定义选项,请使用 impulseplot

    比较多个系统的冲激响应示例说明了如何在一个轴上绘制多个单独系统的响应。当有多个动态系统排列在模型数组中时,impulse 会同时绘制所有这些系统的响应。

    创建模型数组。对于此示例,请使用具有不同固有频率的二阶传递函数的一维数组。首先,为模型数组预分配内存。以下命令会创建一个行向量,其中包含 5 个零增益 SISO 传递函数。前两个维度表示模型输出和输入。其余维度是数组维度。

     sys = tf(zeros(1,1,1,5));

    填充该数组。

    w0 = 1.5:1:5.5;    % natural frequencies
    zeta = 0.5;        % damping constant
    for i = 1:length(w0)
       sys(:,:,1,i) = tf(w0(i)^2,[1 2*zeta*w0(i) w0(i)^2]);
    end

    (有关模型数组以及如何创建模型数组的详细信息,请参阅Model Arrays (Control System Toolbox)。)绘制数组中所有模型的冲激响应。

    impulse(sys)

    MATLAB figure

    impulse 对数组中所有条目的响应使用相同的线型。区分各条目的一种方法是使用动态系统模型的 SamplingGrid 属性将数组中的每个条目与对应的 w0 值相关联。

    sys.SamplingGrid = struct('frequency',w0);

    现在,当您在 MATLAB 图窗窗口中绘制响应时,您可以点击一条轨迹来查看它对应的频率值。

    当您为 impulse 提供输出参量时,该函数会返回响应数据数组。对于 SISO 系统,响应数据以列向量形式返回,其长度等于对响应进行采样的时间点的数量。您可以提供时间点的向量 t,也可以允许 impulse 根据系统动态特性为您选择时间点。例如,提取 SISO 系统在 t = 0 和 t = 5 秒之间的 101 个时间点的冲激响应。

    sys = tf(4,[1 2 10]);
    t = 0:0.05:5;
    y = impulse(sys,t);
    size(y)
    ans = 1×2
    
       101     1
    
    

    对于 MIMO 系统,响应数据以 N×Ny×Nu 维度的数组形式返回,其中 NyNu 是动态系统的输出数量和输入数量。例如,假设有以下状态空间模型,它表示具有两个输入、一个输出的系统。

    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 = 1×3
    
       200     1     2
    
    

    y(:,i,j) 是包含在时间 t 处从第 j 个输入到第 i 个输出的冲激响应的列向量。例如,提取从第二个输入到输出的冲激响应。

    y12 = y(:,1,2);
    plot(t,y12)

    Figure contains an axes object. The axes object contains an object of type line.

    将参数化辨识模型的冲激响应与非参数化(经验)模型的冲激响应进行比较。另请查看它们的 3 σ 置信域。

    加载数据。

    load iddata1 z1

    估计参数化模型。

    sys1 = ssest(z1,4);

    估计非参数化模型。

    sys2 = impulseest(z1);

    绘制冲激响应以进行比较。

    t = (0:0.1:10)';
    [y1, ~, ~, ysd1] = impulse(sys1,t);
    [y2, ~, ~, ysd2] = impulse(sys2,t);
    plot(t, y1, 'b', t, y1+3*ysd1, 'b:', t, y1-3*ysd1, 'b:')
    hold on
    plot(t, y2, 'g', t, y2+3*ysd2, 'g:', t, y2-3*ysd2, 'g:')

    Figure contains an axes object. The axes object contains 6 objects of type line.

    计算辨识时间序列模型的冲激响应。

    时间序列模型,也称为信号模型,是一种没有测量输入信号的模型。这种模型的冲激图使用其(未经测量的)噪声通道作为应用冲激信号的输入通道。

    加载数据。

    load iddata9;

    估计时间序列模型。

    sys = ar(z9, 4);

    sysA y(t) = e(t) 形式的模型,其中 e(t) 表示噪声通道。对于冲激响应的计算,e(t) 被视为输入通道,并被命名为 e@y1

    绘制冲激响应。

    impulse(sys)

    MATLAB figure

    创建状态空间模型。

    A = [-0.8429,-0.2134;-0.5162,-1.2139];
    B = [0.7254,0.7147;0,-0.2050];
    C = [-0.1241,1.4090;1.4897,1.4172];
    D = [0.6715,0.7172;-1.2075,0];
    sys = ss(A,B,C,D);

    创建默认选项集并使用圆点表示法指定值。

    respOpt = RespConfig;
    respOpt.Bias = [-2,3];
    respOpt.Amplitude = [2,-0.5];
    respOpt.InitialState = [0.1,-0.1];
    respOpt.Delay = 5;

    计算冲激响应。

    t = 0:0.1:20;
    impulse(sys,t,respOpt)

    MATLAB figure

    此示例说明如何对 LPV 模型的冲激响应进行仿真。此示例对 fcnMaglev.m 中定义的悬浮球模型对扰动 du 的闭环响应进行仿真。

    maglev-feedback.png

    您必须将参考设置为 h0,以便正确初始化系统并使其维持在 h = h0 左右。

    创建模型并将其离散化。

    hmin = 0.05; 
    hmax = 0.25;
    h0 = (hmin+hmax)/2;
    Ts = 0.01;
    Glpv = lpvss("h",@fcnMaglev,0,0,h0);
    Glpvd = c2d(Glpv,Ts,"tustin"); 

    对 LPV 模型的三个高度值进行采样,并调节 PID 控制器。

    hpid = linspace(hmin,hmax,3);
    [Ga,Goffset] = sample(Glpvd,[],hpid);
    wc = 50;
    Ka = pidtune(Ga,"pidf",wc);
    Ka.Tf = 0.01;

    创建增益调度 PID 控制器。

    Ka.SamplingGrid = struct("h",hpid);
    Koffset = struct("y",{Goffset.u});
    Clpv = ssInterpolant(ss(Ka),Koffset);

    创建闭环模型。

    CL = feedback(Glpvd*[1,Clpv],1,2,1);
    CL.InputName = {'du';'href'};
    CL.OutputName = "h";

    获取 h = h0 时的稳态电流,以便确定扰动的大小。

    [~,~,~,~,~,~,~,u0] = Glpv.DataFunction(0,h0);

    duh0 的冲激变化的响应。

    t = 0:Ts:2;
    pFcn = @(k,x,u) x(1);
    Config = RespConfig(...
        Bias=[0;h0], ...
        Amplitude=0.2*[u0;h0]*Ts, ...
        Delay=0.5, ...
        InitialParameter=h0);
    impulse(CL,t,pFcn,Config)
    title("Current Impulse Disturbance and Height Impulse Change")

    MATLAB figure

    创建一个具有复系数的状态空间模型。

    A = [-2-2i -2;1 0];
    B = [2;0];
    C = [0 0.5+2.5i];
    D = 0;
    sys = ss(A,B,C,D);

    计算该系统的冲激响应。

    [y,t] = impulse(sys);

    得到的响应数据包含复数输出值。

    y
    y = 323×1 complex
    
       0.0000 + 0.0000i
       0.0674 + 0.2613i
       0.1529 + 0.4852i
       0.2502 + 0.6728i
       0.3537 + 0.8257i
       0.4585 + 0.9465i
       0.5607 + 1.0378i
       0.6570 + 1.1028i
       0.7447 + 1.1445i
       0.8221 + 1.1663i
       0.8877 + 1.1713i
       0.9409 + 1.1625i
       0.9813 + 1.1428i
       1.0090 + 1.1148i
       1.0245 + 1.0809i
          ⋮
    
    

    输入参数

    全部折叠

    动态系统,指定为 SISO 或 MIMO 动态系统模型或动态系统模型数组。您可以使用以下类型的动态系统:

    • 连续时间或离散时间数值 LTI 模型,如 tfzpkss 模型。

    • 广义或不确定的 LTI 模型,如 genssuss 模型。(使用不确定模型需要 Robust Control Toolbox™ 软件。)

      • 对于可调控制设计模块,该函数在绘图和返回响应数据时,都会根据其当前值评估模型。

      • 对于不确定的控制设计模块,该函数绘制模型的标称值和随机样本。使用输出参量时,该函数仅返回标称模型的响应数据。

    • 稀疏状态空间模型,如 sparssmechss 模型。

    • 辨识的 LTI 模型,如 idtfidssidproc 模型。对于此类模型,该函数还可以绘制置信区间并返回频率响应的标准差。请参阅具有置信域的辨识模型的阶跃响应

    • 线性时变 (ltvss (Control System Toolbox)) 和线性参数变化 (lpvss (Control System Toolbox)) 模型。

    该函数不支持频率响应数据模型,如 frdgenfrdidfrd 模型。

    如果 sys 是模型数组,该函数会在同一坐标区中绘制数组中所有模型的响应。请参阅模型数组中系统的阶跃响应

    要计算响应的时间步,指定为以下值之一:

    • 正标量 tFinal - 计算从 t = 0t = tFinal 的响应。

    • 二元素向量 [t0 tFinal] - 计算从 t = t0t = tFinal 的响应。 (自 R2023b 起)

    • 向量 Ti:dt:Tf - 计算 t 中指定的时间点的响应。

      • 对于连续时间系统,dt 是连续系统的离散逼近的采样时间。

      • 对于具有指定采样时间的离散时间系统,dt 必须与 sys 的采样时间属性 Ts 匹配。

      • 对于未指定采样时间 (Ts = -1) 的离散时间系统,dt 必须为 1

    • [] - 根据系统动态特性自动选择时间值。

    当您使用 tFinal[t0 tFinal] 指定时间范围时:

    • 对于连续时间系统,该函数根据系统动态特性自动确定时间步的大小和点数。

    • 对于具有指定采样时间的离散时间系统,该函数使用 sys 的采样时间作为步长。

    • 对于未指定采样时间 (Ts = -1) 的离散时间系统,该函数将 tFinal 解释为采样时间为 1 秒时要仿真的采样周期数。

    使用 sysTimeUnit 属性中指定的时间单位表示 t

    如果您使用 config 指定一个步延迟 td,则该函数会在 t = t0+td 时应用该步。

    LPV 模型的参数轨迹,指定为矩阵或函数句柄。

    • 对于外生轨迹或显式轨迹,将 p 指定为维度为 N×Np 的矩阵,其中 N 是时间采样的数量,Np 是参数的数量。

      因此,行向量 p(i,:) 包含第 i 个时间步处的参数值。

    • 对于内生轨迹或隐式轨迹,将 p 指定为形式为 p = F(k,x,u) 的函数句柄,从而将参数作为时间采样 k、状态 x 和输入 u 的函数提供。impulse 仅对离散时间 LPV 模型支持此选项。

      当您想要对准 LPV 模型进行仿真时,此选项非常有用。

    所施加冲激信号的配置,指定为 RespConfig 对象。默认情况下,impulse 在时间 t = 0 时应用输入。使用此输入参量可更改响应配置,例如指定延迟或输入偏移量。有关示例,请参阅配置冲激响应选项 (Control System Toolbox)

    对于偏移量为 (x0(t),u0(t)) 的 lpvss (Control System Toolbox)ltvss (Control System Toolbox) 模型,您可以使用 RespConfig 定义相对于 u0(t,p) 的输入,并使用状态 x0(t,p) 初始化仿真。

    输出参量

    全部折叠

    冲激响应数据,以数组形式返回。

    • 对于 SISO 系统,y 是与 t(如果提供)或 tOut(如果未提供 t)长度相同的列向量。

    • 对于单输入、多输出系统,y 是行数与时间采样数相同、列数与输出数相同的矩阵。因此,y 的第 j 列或 y(:,j) 包含从输入到第 j 个输出的冲激响应。

    • 对于 MIMO 系统,每个输入通道的冲激响应沿 y 的第三维度堆叠。因此 y 的维度为 N×Ny×Nu,其中:

      • N 是时间采样的数量。

      • Ny 是系统输出的数量。

      • Nu 是系统输入的数量。

      因此,y(:,i,j) 是包含在 ttOut 中指定的时间处从第 j 个输入到第 i 个输出的冲激响应的列向量。

    • 对于具有复系数的系统,y 是复数值数组。 (自 R2025a 起)

    计算冲激响应的时间,以向量形式返回。如果您未提供特定的时间向量 timpulse 会根据系统动态特性选择此时间向量。时间以 sys 的时间单位表示。

    状态轨迹,以数组形式返回。当 sys 是状态空间模型时,x 包含 ttOut 中每次 sys 状态的演化。x 的维度为 N×Nx×Nu,其中:

    • N 是时间采样的数量。

    • Nx 是状态的数量。

    • Nu 是系统输入的数量。

    因此,如果在第 k 个输入处注入冲激,则状态演化由数组 x(:,:,k) 表示。行向量 x(i,:,k) 包含第 i 个时间步处的状态值。

    对于具有复系数的系统,x 是复数值数组。 (自 R2025a 起)

    辨识模型的冲激响应的标准差,以与 y 具有相同维度的数组形式返回。如果 sys 不包含参数协方差信息,则 ysd 为空。

    参数轨迹,以数组形式返回。当 sys 是线性参数变化模型时,pOut 包含 ttOut 中每次 sys 参数的演化。pOut 的维度为 N×Np×Nu,其中:

    • N 是时间采样的数量。

    • Np 是参数的数量。

    • Nu 是系统输入的数量。

    因此,如果在第 k 个输入处注入信号,则参数演化由数组 pOut(:,:,k) 表示。行向量 pOut(i,:,k) 包含第 i 个时间步处的参数值。

    限制

    • 具有非零 D 矩阵的连续系统的冲激响应在 t = 0 时是无穷大的。impulse 会忽略这种不连续性,并返回 t = 0 时的较低连续性值 Cb

    • impulse 命令不适用于具有内部延迟的连续时间模型。对于此类模型,在计算冲激响应之前,请使用 pade (Control System Toolbox) 来逼近时间延迟。

    • 对于连续时间 LPV 模型,impulse 命令不支持沿隐式参数轨迹进行仿真。

    提示

    • 要仿真系统对任意输入信号的响应,请使用 lsim

    • 当您需要额外的绘图自定义选项时,请改用 impulseplot

    • 使用 impulse 创建的绘图不支持以字符串数组或字符向量元胞数组形式指定的多行标题或标签。要指定多行标题和标签,请使用包含 newline 字符的单个字符串。

      impulse(sys)
      title("first line" + newline + "second line");

    算法

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

    x˙=Ax+buy=Cx

    等效于以下具有初始状态 b 的非强迫响应。

    x˙=Ax,x(0)=by=Cx

    为了仿真此响应,通过对输入使用零阶保持来对系统进行离散化处理。除非提供了时间向量 t = T0:dt:Tf,否则采样时间根据系统动态特性自动选择。因此,dt 用作采样时间。

    版本历史记录

    在 R2006a 之前推出

    全部展开

    另请参阅

    (Control System Toolbox) | | | | (Control System Toolbox) |