关于Matlab中lsim函数连续与离散传递函数计算不一致的咨询
我对Matlab的lsim函数处理逻辑有疑问。已知向Matlab输入连续时间传递函数、采样输入信号和时间向量时,通常会采用零阶保持(ZOH)或一阶保持(FOH)对传递函数离散化。但直接用lsim计算连续模型输出y_cont,和将模型通过ZOH、FOH离散后再用lsim得到的y_zoh、y_foh对比,结果均不匹配。测试代码如下:
Ts=0.1; %sampling time t=0:Ts:10; %time vector u=cos(t); %input signal G=tf(1,[1 1]); %Continuous-time model y_cont=lsim(G,u,t); %Output of the continuous-time model Gzoh=c2d(G,Ts,'zoh');%ZOH discretization y_zoh=lsim(Gzoh,u); Gfoh=c2d(G,Ts,'foh');%FOH discretization y_foh=lsim(Gfoh,u,t);
问题:输入为余弦信号时,按理说Matlab应采用FOH,为何y_cont与y_foh的计算逻辑存在差异?
核心原因解析
连续模型
lsim的本质是数值积分
直接对连续模型调用lsim(G,u,t)时,Matlab不会先离散化系统,而是直接调用ODE数值求解器对连续时间微分方程进行求解。它会基于输入的采样点,在整个时间区间内更精细地计算系统响应,完全贴合连续输入信号的真实变化,而非依赖ZOH/FOH的离散化假设。FOH离散化是近似假设
c2d(G,Ts,'foh')的一阶保持逻辑是:假设两个采样点之间的输入信号是线性插值的。但你的输入u=cos(t)是连续的非线性余弦曲线,FOH的线性近似只是对真实输入的简化模拟,和连续仿真中使用的、更接近真实曲线的输入重构方式存在本质差异,因此仿真结果必然不匹配。调用参数的细节影响
注意y_zoh=lsim(Gzoh,u);未传入时间向量t,而y_cont和y_foh传入了t。虽然此处影响有限,但离散模型的lsim若不指定t,会默认使用与输入u长度一致的采样序列,但本质上仍是离散点的迭代计算,和连续模型的积分求解逻辑完全不同。
总结:连续模型的lsim是直接求解连续系统微分方程,离散化后的仿真是基于保持器假设的离散系统迭代,两者底层逻辑完全不同——FOH只是离散化的一种近似方法,并非连续仿真的等价实现,因此结果会有差异。
内容的提问来源于stack exchange,提问作者Jean-Fr

