MATLAB lsim函数输出类型咨询及双体质量弹簧阻尼器仿真疑问
关于MATLAB lsim函数输出的问题解答
嘿,这个问题的核心其实在于你定义状态空间模型时的输出矩阵C——lsim的输出既不是固定的导数也不是固定的状态向量,完全取决于你给的C矩阵对应的输出定义。
先帮你理清楚逻辑:
- 状态空间模型的标准形式是:
$\dot{x} = Ax + Bu$
$y = Cx + Du$
这里lsim返回的结果就是公式里的$y$,也就是你通过C矩阵指定要提取的输出量。
结合你的双体质量-弹簧-阻尼器场景来说:
通常我们会把状态向量定义成包含各质量的位移和速度,比如 $x = [x_{base}, \dot{x}_{base}, x_1, \dot{x}1, x_2, \dot{x}2]^T$($x{base}$是基座位移,$\dot{x}{base}$是基座速度,以此类推)。
- 如果你设置的C矩阵是单位矩阵(
eye(size(A,1))),那lsim的输出就是完整的状态向量,包含所有位移和速度分量; - 但如果你的C矩阵只选中了速度对应的状态分量(比如只把$\dot{x}_{base}$、$\dot{x}_1$、$\dot{x}_2$的位置设为1),那输出自然就是速度序列;
- 你现在遇到的“预期输出位移但结果像速度”的情况,大概率是C矩阵的定义和你的预期不匹配——比如本来想选位移对应的状态索引,结果误选了速度的索引。
给你几个快速排查和解决的建议:
- 先检查你的C矩阵:在MATLAB里输入
disp(C),看看矩阵里的1都分布在哪些位置,是不是对应你想要输出的位移分量; - 举个具体例子:假设你的状态向量是$x = [x_{base}, \dot{x}_{base}, x_1, \dot{x}_1]$,如果想输出基座和质量1的位移,C矩阵应该写成:
这样C = [1 0 0 0; 0 0 1 0];lsim返回的y就是这两个位移的时间序列; - 如果你是用
ss(A,B)直接创建模型没指定C和D,MATLAB默认会把C设为单位矩阵,D设为0矩阵,这时候输出就是完整的状态向量——但如果你自己手动修改过C,就一定要核对。
内容的提问来源于stack exchange,提问作者shlady
相关产品推荐
相关产品推荐

