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
相关产品推荐
相关产品推荐

