主要内容

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

lsim

计算动态系统对任意输入的时间响应仿真数据

说明

响应数据

y = lsim(sys,u,t) 返回系统对输入 u 的响应 y,采样时间 t 与输入相同。对于单输出系统,y 是与 t 长度相同的向量。对于多输出系统,y 是行数与时间采样数相同、列数与 sys 中的输出数相同的数组。

示例

sys 是状态空间模型时,y = lsim(sys,u,t,IC) 进一步指定 t(1) 时的初始条件 IC

sys 是 LPV 模型时,y = lsim(sys,u,t,IC,p) 指定参数轨迹 p (自 R2023a 起)

示例

[y,tOut] = lsim(___) 返回用于仿真的时间采样 tOut

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

示例

sys 是 LPV 模型时,[y,tOut,x,pOut] = lsim(sys,u,t,IC,p) 返回参数轨迹。 (自 R2023a 起)

输入插值方法

sys 是连续时间模型时,[___] = lsim(___,method) 指定 lsim 如何在采样之间对输入值进行插值。

状态快照 POD

自 R2024b 起

[y,tOut,x,~,xPODOut] = lsim(___,xPODIn) 对 LTI 状态空间模型 sys 的状态快照执行本征正交分解 (POD)。这里,xPOD 是一个 incrementalPOD 对象。您可以开始新的 POD 分析或向先前的 POD 结果中添加数据。有关示例和模型降阶应用,请参阅 incrementalPOD (Control System Toolbox)reducespec (Control System Toolbox)

示例

sys 是连续时间模型时,[y,tOut,x,~,xPODOut] = lsim(___,xPODIn,method) 指定输入信号插值方法。

响应图

lsim(___) 绘制 sys 对所有先前输入参量组合(除状态快照 POD 外)的输入历史记录 (u,t) 的仿真时间响应图。该图使用默认的绘图选项。如需更多绘图自定义选项,请改用 lsimplot

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

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

线性仿真工具

lsim(sys) 用于打开线性仿真工具以对 sys 进行仿真。有关使用此工具进行线性分析的详细信息,请参阅使用线性仿真工具 (Control System Toolbox)

示例

全部折叠

假设有以下传递函数。

sys = tf(3,[1 2 3])
sys =
 
        3
  -------------
  s^2 + 2 s + 3
 
Continuous-time transfer function.
Model Properties

要计算此系统对任意输入信号的响应,需向 lsim 提供一个包含您要计算响应的时间的时间向量 t,以及一个包含相应信号值的向量 u。例如,绘制此系统对斜坡阶跃信号的响应,该信号在时间 t = 0 时从 0 开始,在 t = 1 时从 0 斜坡上升到 t = 2 时的 1,然后保持稳定在 1。定义 t 并计算 u 的值。

t = 0:0.04:8;  % 201 points
u = max(0,min(t-1,1));

不使用任何输出参量调用 lsim 来绘制此系统对该信号的响应。

lsim(sys,u,t)
grid on

MATLAB figure

该图以灰色显示应用的输入 (u,t),以蓝色显示系统响应。

使用输出参量调用 lsim 来获取仿真响应数据。

y = lsim(sys,u,t);
size(y)
ans = 1×2

   201     1

向量 y 包含在 t 中相应时间点的仿真响应。

使用 gensig (Control System Toolbox) 创建周期性输入信号(如正弦波和方波)以用于 lsim。仿真以下 SISO 状态空间模型对方波的响应。

A = [-3 -1.5; 5 0];
B = [1; 0];
C = [0.5 1.5];
D = 0;
sys = ss(A,B,C,D);

对于此示例,创建一个周期为 10 秒、持续时间为 20 秒的方波。

[u,t] = gensig("square",10,20);

gensig 返回时间步的向量 t 和包含输入信号相应值的向量 u。(如果您没有为 t 指定采样时间,则 gensig 会每个周期生成 64 个采样。)对 lsim 使用这两个向量,并绘制系统响应。

lsim(sys,u,t)
grid on

MATLAB figure

该图以灰色显示施加的方波,以蓝色显示系统响应。使用输出参量调用 lsim 来获取 t 中每个时间点的响应值。

[y,~] = lsim(sys,u,t);

对离散时间系统的响应进行仿真时,时间向量 t 必须采用 Ti:dT:Tf 的形式,其中 dT 是模型的采样时间。仿真以下离散时间传递函数对斜坡阶跃输入的响应。

sys = tf([0.06 0.05],[1 -1.56 0.67],0.05);

此传递函数的采样时间为 0.05 秒。使用相同的采样时间生成时间向量 t 和斜坡阶跃信号 u

t = 0:0.05:4;  
u = max(0,min(t-1,1));

绘制系统响应。

lsim(sys,u,t)

MATLAB figure

要仿真离散时间系统对周期性输入信号的响应,请将相同的采样时间用于 gensig 来生成输入。例如,仿真系统对周期为 1 秒、持续时间为 4 秒的正弦波的响应。

[u,t] = gensig("sine",1,4,0.05);

绘制系统响应。

lsim(sys,u,t)

MATLAB figure

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

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

形成闭环系统。

sys1 = feedback(H*C1,1);
sys2 = feedback(H*C2,1);

绘制两个系统对周期为 4 秒的方波的响应。

[u,t] = gensig("square",4,12);
lsim(sys1,sys2,u,t)
grid on
legend("PI","PID")

MATLAB figure

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

 lsim(sys1,"r--",sys2,"b",u,t)
 grid on
 legend("PI","PID")

MATLAB figure

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

在 MIMO 系统中,在每个时间步 t 处,输入 u(t) 是长度等于输入数的向量。要使用 lsim,您需要将 u 指定为维度为 Nt×Nu 的矩阵,其中 Nu 是系统输入的数目,Ntt 的长度。换句话说,u 的每一列都是施加于相应系统输入端的输入信号。例如,要在 201 个时间步对一个具有四个输入的系统进行仿真,需要提供一个由四列和 201 行组成的矩阵作为 u,其中每一行 u(i,:) 是第 i 个时间步时的输入值向量;每一列 u(:,j) 是在第 j 个输入端处施加的信号。

类似地,由 lsim 计算得到的输出 y(t) 是一个矩阵,其列表示每个系统输出端处的信号。当您使用 lsim 绘制仿真响应时,lsim 会为每个输出提供单独的坐标区,表示每个输出通道中的对在所有输入端施加的输入 u(t) 的系统响应。

假设有具有以下状态空间矩阵的双输入、三输出状态空间模型。

A = [-1.5  -0.2   1.0;
     -0.2  -1.7   0.6;
      1.0   0.6  -1.4];
  
B = [ 1.5  0.6;
     -1.8  1.0;
      0    0  ];

C = [ 0    -0.5 -0.1;
      0.35 -0.1 -0.15
      0.65  0    0.6];
  
D = [ 0.5  0;
      0.05 0.75
      0    0];

sys = ss(A,B,C,D);

绘制 sys 对周期为 4 秒的方波(施加到第一个输入 sys)和每 3 秒施加一次的冲激(施加到第二个输入)的响应。为此,使用 gensig 创建表示该方波和该冲激信号的列向量。然后将这些列堆叠组合成一个输入矩阵。为确保两个信号具有相同的采样数,需指定相同的结束时间和采样时间。

Tf = 10;
Ts = 0.1;
[uSq,t] = gensig("square",4,Tf,Ts);
[uP,~] = gensig("pulse",3,Tf,Ts);
u = [uSq uP];
lsim(sys,u,t)

MATLAB figure

每个轴显示三个系统输出端之一对施加在所有输入端的信号 u 的响应。每个图还以灰色显示所有输入信号。

默认情况下,lsim 在仿真模型时假设所有状态在仿真开始时均为零。在对状态空间模型的响应进行仿真时,可使用可选的 x0 输入参量来指定非零初始状态值。假设有以下双状态 SISO 状态空间模型。

A = [-1.5 -3;
      3   -1];
B = [1.3; 0];
C = [1.15 2.3];
D = 0;
          
sys = ss(A,B,C,D);

假设您希望该系统在无输入的情况下从一组已知的初始状态开始演化 2 秒,然后施加单位阶跃变化。指定初始状态值向量 x0,并创建输入向量。

x0 = [-0.2 0.3];
t = 0:0.05:8;
u = zeros(length(t),1);
u(t>=2) = 1;
lsim(sys,u,t,x0)
grid on

MATLAB figure

该图的前半部分显示该系统从初始状态值 [-0.2 0.3] 开始的自由演化。在 t = 2 时,输入发生阶跃变化,该图显示该系统从该时间点的状态值开始对这个新信号的响应。

当您使用输出参量调用 lsim 时,它会以数组形式返回仿真响应数据。对于 SISO 系统,响应数据以列向量形式返回,该列向量与 t 长度相同。例如,提取 SISO 系统对方波的响应。使用 gensig 创建该方波。

sys = tf([2 5 1],[1 2 3]);
[u,t] = gensig("square",4,10,0.05);
[y,t] = lsim(sys,u,t);
size(y)
ans = 1×2

   201     1

向量 y 包含 t 中每个时间步时的仿真响应。(为方便起见,lsim 返回时间向量 t。)

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

A = [-1.5  -0.2   1.0;
     -0.2  -1.7   0.6;
      1.0   0.6  -1.4];
  
B = [ 1.5  0.6;
     -1.8  1.0;
      0    0  ];

C = [ 0   -0.1 -0.2;
      0.7 -0.2 -0.3
     -0.65 0   -0.6];
  
D = [ 0.1  0;
      0.1  1.5
      0    0];

sys = ss(A,B,C,D);

提取三个输出通道对施加在两个输入端的该方波的响应。

uM = [u u];
[y,t] = lsim(sys,uM,t);
size(y)
ans = 1×2

   201     3

y(:,j) 是包含第 j 个输出对施加在两个输入端的该方波的响应的列向量。也就是说,y(i,:) 是一个包含三个值的向量,即第 i 个时间步的输出值。

由于 sys 是状态空间模型,因此您可以提取状态值随时间的演化,即状态值对输入信号的响应。

[y,t,x] = lsim(sys,uM,t);
size(x)
ans = 1×2

   201     3

x 的每一行包含在 t 中相应时间点的状态值 [x1,x2,x3]。换句话说,x(i,:) 是第 i 个时间步的状态向量。绘制状态值。

plot(t,x)

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

“绘制多个系统对同一输入的响应”示例说明了如何在一个轴上绘制多个单独系统的响应。当有多个动态系统排列在模型数组中时,lsim 会同时绘制所有这些系统的响应。

创建模型数组。对于此示例,请使用具有不同固有频率的二阶传递函数的一维数组。首先,为模型数组预分配内存。以下命令会创建一个行向量,其中包含 5 个零增益 SISO 传递函数。前两个维度表示模型输出和输入。其余维度是数组维度。(有关模型数组以及如何创建模型数组的详细信息,请参阅Model Arrays (Control System Toolbox)。)

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

绘制数组中所有模型对方波输入的响应。

[u,t] = gensig("square",5,15);
lsim(sys,u,t)

MATLAB figure

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

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

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

加载估计数据以估计模型。

load dcmotordata
z = iddata(y,u,0.1,'Name','DC-motor');

z 是一个 iddata 对象,它存储采样时间为 0.1 秒的单输入双输出估计数据。

使用估计数据 z 估计 4 阶状态空间模型。

[sys,x0] = n4sid(z,4);

sys 是估计得到的模型,x0 是估计得到的初始状态。

使用用于估计的相同输入数据和估计命令返回的初始状态,对 sys 的响应进行仿真。

[y,t,x] = lsim(sys,z.InputData,[],x0);

在本语法中,y 是系统响应,t 是用于仿真的时间向量,x 是状态轨迹。

比较两个输出的仿真响应 y 和测量响应 z.OutputData

subplot(211), plot(t,z.OutputData(:,1),'k',t,y(:,1),'r')
legend('Measured','Simulated')
subplot(212), plot(t,z.OutputData(:,2),'k',t,y(:,2),'r')
legend('Measured','Simulated')

Figure contains 2 axes objects. Axes object 1 contains 2 objects of type line. These objects represent Measured, Simulated. Axes object 2 contains 2 objects of type line. These objects represent Measured, Simulated.

对于此示例,fcnMaglev.m 定义了一个磁悬浮系统的矩阵和偏移量。该磁悬浮系统通过线圈电流控制悬浮球的高度,线圈电流会对悬浮球产生磁力。此示例对模型进行开环仿真。

创建 LPV 模型。

lpvSys = lpvss('h',@fcnMaglev)
Continuous-time state-space LPV model with 1 outputs, 1 inputs, 2 states, and 1 parameters.
Model Properties

您可以使用圆点表示法设置额外的属性。

lpvSys.StateName = {'h','hdot'};
lpvSys.InputName = 'current';
lpvSys.InputName = 'height';

仿真此模型对任意正弦输入电流的响应。

h0 = 1;
[~,~,~,~,~,~,x0,u0,~] = fcnMaglev([],h0);
ic = findop(lpvSys,0,h0,x=x0,u=u0);
t = 0:1e-3:1;
u = u0*(1+0.1*sin(10*t));
y = lsim(lpvSys,u,t,ic,@(t,x,u) x(1));

绘制响应。

plot(t,y,t,u/u0)
legend('height','current')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent height, current.

当电流首次增大(h 减小)时,悬浮球会被磁铁吸引。随后电流的减小不足以使悬浮球回到原来的位置。

对于此模型,h = 0 是一个奇异点,即悬浮球碰到了磁铁。此时,LPV 模型不再有效。

采样时间的选择会极大地影响仿真结果。为了说明原因,假设有以下二阶模型。

sys(s)=ω2s2+2s+ω2,ω=62.83.

使用 0.1 秒的采样时间,仿真此模型对周期为 1 秒的方波的响应。

w2 = 62.83^2;
sys = tf(w2,[1 2 w2]);

tau = 1;
Tf = 5;
Ts = 0.1;
[u,t] = gensig("square",tau,Tf,Ts);
lsim(sys,u,t)

lsim warning message: The input signal is undersampled.

lsim 使用指定的输入信号对此模型进行仿真,但它发出指示输入信号欠采样的警告。lsim 推荐使用在输入 u 的每个周期至少生成 64 个采样的采样时间。为了解此推荐为何重要,使用小于推荐最大值的采样时间再次对 sys 进行仿真。

figure
Ts2 = 0.01;
[u2,t2] = gensig("square",tau,Tf,Ts2);
lsim(sys,u2,t2)

此响应呈现出强烈的振荡行为,而在欠采样版本的仿真中这种行为被掩盖了。

此示例说明如何使用自定义仿真来获取状态快照数据并执行 POD 模型降阶。默认情况下,POD 算法提供三种类型的内置激励信号(啁啾信号、冲激信号和 PRBS 信号)来进行仿真。软件会对模型进行仿真并提取状态快照数据,然后近似计算可控性和可观测性 Gramian。或者,您可以提供通过 incrementalPODlsim 进行仿真生成的自定义 POD 数据。

生成具有 30 个状态、一个输入和一个输出的随机状态空间模型,并创建模型降阶任务。

rng(0)
sys = rss(30,1,1);
R = reducespec(sys,"pod");

对于此示例,创建一个叠加正弦信号作为输入信号来运行仿真。

t = linspace(0,100,10000);
u = 0.5*(sin(1.*t)+sin(3.*t)+sin(5.*t)+sin(8.*t)+sin(10.*t));

创建增量 POD 对象,用于存储可控性和可观测性 Gramian 的近似值。

rPOD = incrementalPOD;
oPOD = incrementalPOD;

使用自定义输入信号 u 对被控对象模型及其伴随模型进行仿真。

[~,~,~,~,rPOD] = lsim(sys,u,t,rPOD);
asys = adjoint(sys);
[~,~,~,~,oPOD] = lsim(asys,u,t,oPOD);

lsim 生成状态快照数据,并返回自定义 POD 数据作为输出。这些数据以与 R.Options 兼容的格式生成。

指定自定义数据并运行模型降阶算法。当您指定选项 CustomLrCustomLo 时,软件会绕过内置仿真,直接使用这些数据。

R.Options.CustomLr = rPOD;
R.Options.CustomLo = oPOD;
R = process(R);

现在您便可以按照典型的工作流来选择阶数并获得降阶模型。

获得一个忽略总能量 0.01% 的降阶模型。

rsys = getrom(R,MaxLoss=1e-4);
order(rsys)
ans = 
9
bodeplot(sys,rsys,"r--")
legend("Original","Reduced")

MATLAB figure

ans = 
  Legend (Original, Reduced) with properties:

         String: {'Original'  'Reduced'}
       Location: 'northeast'
    Orientation: 'vertical'
       FontSize: 8.1000
       Position: [0.7707 0.8532 0.1875 0.0923]
          Units: 'normalized'

  Show all properties

降阶模型提供了全阶模型的良好逼近。

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

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

计算系统对周期为 4 秒的方波的响应。

[u,t] = gensig("square",4,12);
[y,tout] = lsim(sys,u,t);

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

y
y = 193×1 complex

   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
      ⋮

输入参数

全部折叠

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

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

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

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

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

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

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

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

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

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

用于仿真的输入信号,指定为以下项之一:

  • 对于单输入系统,u 是与 t 长度相同的向量。

  • 对于多输入系统,u 是行数与时间采样数 (length(t)) 相同、列数与 sys 的输入数相同的数组。换句话说,每一行 u(i,:) 表示在时间 t(i) 时应用于 sys 输入的值。每一列 u(:,j) 是施加于 sys 的第 j 个输入的信号。

要计算响应的时间采样,指定为 T0:dT:Tf 形式的向量。lsim 命令将 t 解释为具有模型 sysTimeUnit 属性中指定的单位。

对于连续时间 syslsim 命令使用时间步 dT 来离散化模型。如果相对于系统动态特性而言 dT 过大(欠采样),lsim 会发出警告,推荐使用更短的采样时间。有关采样时间对仿真的影响的进一步讨论,请参阅采样时间对仿真的影响 (Control System Toolbox)

对于离散时间 sys,时间步 dT 必须等于 sys 的采样时间。或者,您可以省略 t 或将其设置为 []。在这种情况下,lsim 会将 t 设置为与 u 长度相同的向量,该向量从 0 开始,时间步等于 sys.Ts

自 R2024b 起

对状态空间模型进行仿真的初始条件,指定为以下项之一:

  • 向量 xinit,在该向量中 sys 中的每个状态对应一个条目。

  • 使用 findop (Control System Toolbox) 获得的工况。通过工作点对象,您可以从具有非零过去 uwy 值的稳态工况开始仿真。例如,要从非零 y 值开始仿真,您可以指定:

    op = findop(sys,y=3);
    y = lsim(sys,u,t,op)

如果您省略此参量,则仿真将从全零初始条件开始。

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

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

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

  • 对于内生轨迹或隐式轨迹,在连续时间内将 p 指定为 p = F(t,x,u) 形式的函数句柄,在离散时间内将其指定为 p = F(k,x,u) 形式的函数句柄,从而将参数作为时间 t 或时间采样 k、状态 x 和输入 u 的函数提供。

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

对连续时间模型进行采样的离散化方法,指定为以下项之一。

  • "zoh" - 零阶保持

  • "foh" - 一阶保持

sys 是连续时间模型时,lsim 通过使用等于 t 的时间步 dT = t(2)-t(1) 的采样时间对模型进行离散化来计算时间响应。如果您未指定离散化方法,则 lsim 会根据信号 u 的平滑度自动选择离散化方法。有关这两种离散化方法的详细信息,请参阅Continuous-Discrete Conversion Methods (Control System Toolbox)

自 R2024b 起

本征正交分解分析,指定为 incrementalPOD (Control System Toolbox) 对象。当您想要绕过 ProperOrthogonalDecomposition (Control System Toolbox) 模型阶数设定所提供的内置激励,并提供您自己的使用自定义激励生成的状态快照数据时,可将 POD 分析与 lsim 结合使用。

您可以将输入 xPODIn 指定为空的 incrementalPOD 对象以开始新的分析,或向先前的仿真返回的对象中添加数据。每次仿真都会用更多的状态数据更新和丰富 POD。

输出参量

全部折叠

仿真响应数据,以数组形式返回。

  • 对于单输入系统,y 是与 t 长度相同的列向量。

  • 对于多输出系统,y 是行数与时间采样数 (length(t)) 相同、列数与 sys 中的输出数相同的数组。因此,y 的第 j 列或 y(:,j) 包含在所有输入端处施加的 u 的第 j 个输出的响应。

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

用于仿真的时间向量,以列向量形式返回。当您指定 0:dT:Tf 形式的输入时间向量 t 时,则 tOut = t。如果 t 几乎是等间隔采样的,则 lsim 会调整用于仿真的采样时间,并在 tOut 中返回结果。对于离散时间 sys,您可以省略 t 或将其设置为 []。在这种情况下,lsim 会将 t 设置为与 u 长度相同的向量(该向量从 0 开始,时间步等于 sys.Ts),并在 tOut 中返回结果。

状态轨迹,以数组形式返回。当 sys 是状态空间模型时,x 包含 sys 的状态响应于输入的演化。x 是行数与时间采样数 (length(t)) 相同、列数与 sys 中的状态数相同的数组。

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

参数轨迹,以数组形式返回。当 sys 是线性参数变化 (lpvss) 模型时,pOut 包含 sys 的参数的演化。pOut 是行数与时间采样数 (length(t)) 相同、列数与 sys 中的参数数目相同的数组。

自 R2024b 起

本征正交分解分析,以 incrementalPOD (Control System Toolbox) 对象形式返回。

lsim 会根据仿真用更多的状态数据更新 xPODIn,并在 xPODOut 中返回结果。要进一步更新和丰富 POD 状态,可将 xPODOut 传递给后续 lsim 仿真。

提示

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

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

    lsim(sys,u,t)
    title("first line" + newline + "second line");

算法

对于离散时间传递函数,

sys(z1)=a0+a1z1++anzn1+b1z1++bnzn,

lsim 根据与此传递函数相关的递归对输入进行滤波:

y[k]=a0u[k]++anu[kn]b1y[k1]bn[kn].

对于离散时间 zpk 模型,lsim 通过一系列一阶或二阶节对输入进行滤波。这种方法避免了形成分子和分母多项式,因为对于高阶模型来说,形成这些多项式可能会导致数值不稳定。

对于离散时间状态空间模型,lsim 传播离散时间状态空间方程,

x[n+1]=Ax[n]+Bu[n],y[n]=Cx[n]+Du[n].

对于连续时间系统,lsim 首先使用 c2d 对系统进行离散化,然后传播得到的离散时间状态空间方程。除非您使用 method 输入参量另行指定,否则 lsim 在输入信号平滑时使用一阶保持离散化方法,而在输入信号不连续(例如冲激或方波)时使用零阶保持离散化方法。离散化的采样时间是您在 t 中提供的时间采样之间的间隔 dT

对于连续时间稀疏模型、LTV 模型和 LPV 模型,lsim 使用基于 trbdfhht 方法的定步长求解器(请参阅 sparssmechss 模型的 SolverOptions 属性)。

版本历史记录

在 R2012a 中推出

全部展开

另请参阅

函数

App