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

时变矩阵A的状态空间方程阶跃/输出响应获取及代码报错解决

解决时变状态空间系统的响应计算问题

首先,咱们来拆解你遇到的两个核心问题:

1. 直接报错的原因

你代码里的t没有被定义为数值时间向量,默认会被当作符号变量处理,sin(t)和cos(t)返回的是符号表达式,和数值0拼接时自然会出现「维度不匹配」的错误。

但更关键的是:Matlab内置的ss、step、initial这些函数是专门给线性时不变(LTI)系统设计的,它们完全不支持时变的A(t)矩阵,这才是根本问题。

2. 时变系统响应的正确计算方法

对于时变状态空间系统,我们需要手动建立微分方程,用数值求解器(比如ode45)来计算状态变量的演化,再推导输出响应。

先明确系统方程

你的时变状态空间系统可以表示为:

$\dot{x}(t) = A(t)x(t) + B u(t)$
$y(t) = C x(t)$
其中 $A(t) = \begin{bmatrix}\sin(t) & 0 \ 0 & \cos(t)\end{bmatrix}, B = \begin{bmatrix}0.5 \ 0.0\end{bmatrix}, C = \begin{bmatrix}1 & 0 \ 0 & 1\end{bmatrix}$


情况1:计算阶跃响应

阶跃响应是零初始条件下,输入为阶跃信号(这里取$u=1$)的系统输出。

步骤1:定义状态微分方程函数

创建一个单独的函数文件(比如time_varying_ss.m):

function dxdt = time_varying_ss(t, x, u)
    % 定义时变矩阵A(t)
    A = [sin(t) 0; 0 cos(t)];
    B = [0.5; 0.0];
    % 状态微分方程
    dxdt = A * x + B * u;
end

步骤2:主脚本求解并绘图

% 设置参数
tspan = [0 10];  % 仿真时间范围
x0 = [0; 0];     % 阶跃响应的零初始条件
u_step = 1;      % 阶跃输入幅值

% 调用ode45求解状态变量
[t, x] = ode45(@(t,x) time_varying_ss(t, x, u_step), tspan, x0);

% 计算输出y(t)
C = [1 0; 0 1];
y = C * x';
y = y';  % 转置为和t匹配的维度

% 绘制响应曲线
figure;
plot(t, y);
title('时变状态空间系统的阶跃响应');
xlabel('时间 t');
ylabel('输出 y_1, y_2');
legend('y_1', 'y_2');
grid on;

情况2:计算初始条件响应

初始条件响应是输入为0,仅由初始状态$x_0$驱动的系统输出。注意:你的原代码里x0 = [-1;0;2];是3维的,但系统是2维状态(A是2x2),这会导致维度不匹配,需要改成2维初始条件!

% 设置参数
tspan = [0 10];
x0 = [-1; 0];  % 修正为2维初始状态
u_zero = 0;    % 输入为0

% 求解状态变量
[t, x] = ode45(@(t,x) time_varying_ss(t, x, u_zero), tspan, x0);

% 计算输出
C = [1 0; 0 1];
y = C * x';
y = y';

% 绘图
figure;
plot(t, y);
title('时变状态空间系统的初始条件响应');
xlabel('时间 t');
ylabel('输出 y_1, y_2');
legend('y_1', 'y_2');
grid on;

总结

Matlab的LTI工具箱函数(ss、step、initial等)只适用于参数不随时间变化的系统。对于时变系统,必须通过数值积分求解微分方程的方式来获取响应,这是最通用的解决方案。

内容的提问来源于stack exchange,提问作者安维桢

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:50:07