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

Scilab状态空间转传递函数异常及还原不一致问题咨询

Scilab状态空间转传递函数的两个问题解决:保留公因子+清除数值误差

问题原因

你的系统中,特征值-3对应的模态是不可观测的,Scilab的ss2tf默认会自动做最小实现——也就是约去不可控/不可观测的模态,所以直接得到了降阶后的传递函数;而Matlab的ss2tf默认不做这个优化,因此保留了原始阶数。另外那个8.882D-16s是浮点数计算产生的数值误差,属于极小值,可以直接清除。

解决方法

1. 强制保留原阶数,不约去公因子

不要用ss2tf,手动通过传递函数的定义公式计算:G(s) = C*(sI - A)^(-1)*B + D,这样能得到你预期的原始传递函数:

clear
A=[-1 0 1; 1 -2 0;0 0 -3];
B=[0;0;1];
C=[1 1 0];
D=[0];

s = poly(0, 's'); // 定义复变量s
// 手动计算分子分母
num = C * inv(s*eye(3) - A) * B + D;
den = det(s*eye(3) - A);
// 合并为传递函数并清除数值误差
G = clean(num / den, 1e-10);

disp(G); // 输出就是 (s+3)/(s^3+6s^2+11s+6)

2. 清除降阶后传递函数的数值误差

如果接受降阶后的传递函数,只想去掉那个极小的s项,用Scilab的clean()函数即可,它会把小于阈值的系数置为0:

clear
A=[-1 0 1; 1 -2 0;0 0 -3];
B=[0;0;1];
C=[1 1 0];
D=[0];
sys=syslin('c', A, B, C, D);

G=ss2tf(sys);
G_clean = clean(G, 1e-10); // 清除极小数值项
disp(G_clean); // 输出就是 1/(s^2+3s+2)

补充说明

如果要把清理后的传递函数转回状态空间,降阶系统的矩阵维度肯定和原系统不同——因为已经约去了一个不可观测模态,这是正常的。如果必须和原系统维度一致,就用第一种手动计算的原始传递函数再转回去。

内容的提问来源于stack exchange,提问作者Dr.mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 03:24:37