You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB中lsim()函数无法正常使用,奇异E矩阵模型初始条件仿真报错

解决MATLAB中PID+状态空间闭环系统仿真初始条件报错问题

问题场景

尝试用MATLAB代码复现Simulink中的PID+状态空间闭环系统响应,运行代码后出现如下报错:

Cannot simulate response with initial condition for models with singular E matrix. Use the "isproper" command to check if the model is proper and to extract an equivalent explicit representation.

原代码:

M = 1.5;
m = 0.5;
l = 10;
g = 9.8;

%% state space
A = [0 1 0 0; 0 0 m*g/M 0; 0 0 0 1; 0 0 g/(M*l)*(M+m) 0];
B = [0; 1/M; 0; 1/(M*l)];
C = [0 0 1 0];
D = 0;
sys_ss = ss(A, B, C, D);

% pid
Kp = 99;
Ki = 49;
Kd = 29;
Gc = pid(Kp, Ki, Kd);

% feedback closed-up system
sys_fb = feedback(Gc*sys_ss, 1);

% simulation time and pid reference input value '0'
t = 0:0.01:10;
r = zeros(size(t));

% x0 = [2; 10; -5; 0]
[y, t] = lsim(sys_fb, r, t, [2; 10; -5; 0]);

% plot
figure();
plot(t, y);
title('PID Controller + State Space Model Closed-Loop System Output');
xlabel('Time (s)');
ylabel('Output');

报错原因

PID控制器包含微分和积分环节,其传递函数为非严格正则形式,与状态空间模型串联后闭环,生成的系统是隐式描述系统(descriptor system),存在奇异的E矩阵,lsim无法直接为这类系统设置初始条件进行仿真。

解决方法

方法一:转换为正则显式系统

使用isproper函数提取闭环系统的等效正则显式模型,再进行仿真:

% 在生成sys_fb后添加以下代码
[~, sys_fb_proper] = isproper(sys_fb);

% 使用正则模型仿真,注意:初始条件会被自动转换,若需精确对应原状态初始条件,建议用方法二
[y, t] = lsim(sys_fb_proper, r, t);

方法二:手动构建包含PID状态的闭环状态空间模型

手动整合原状态空间与PID的状态(积分环节状态),构建显式闭环状态空间,直接指定完整初始条件:

M = 1.5;
m = 0.5;
l = 10;
g = 9.8;

%% 原状态空间参数
A = [0 1 0 0; 0 0 m*g/M 0; 0 0 0 1; 0 0 g/(M*l)*(M+m) 0];
B = [0; 1/M; 0; 1/(M*l)];
C = [0 0 1 0];
D = 0;

% PID参数
Kp = 99;
Ki = 49;
Kd = 29;

% 计算闭环系统矩阵
denominator = 1 + Kd*C*B;
A11 = A - B*(Kp*C + Kd*C*A)/denominator;
A12 = B*Ki/denominator;
A21 = -C;
A22 = 0;
A_cl = [A11, A12; A21, A22];

% 输出矩阵:y = C*x,x是原状态空间的状态
C_cl = [C, zeros(1,1)];

% 构建显式闭环状态空间模型
sys_cl = ss(A_cl, [], C_cl, 0);

% 仿真设置
t = 0:0.01:10;
r = zeros(size(t));
% 初始条件:原状态初始值 + PID积分环节初始值(设为0)
X0 = [2; 10; -5; 0; 0];

% 仿真
[y, t] = lsim(sys_cl, r, t, X0);

% 绘图
figure();
plot(t, y);
title('PID Controller + State Space Model Closed-Loop System Output');
xlabel('Time (s)');
ylabel('Output');

该方法直接构建显式状态空间,能精确控制所有状态的初始条件,避免隐式系统的问题。

内容的提问来源于stack exchange,提问作者魏嘉伟

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:57:33