对于矩阵A
依赖于变量t
(时间)的状态空间方程,如何获得阶跃或输出响应?
这是代码,它不起作用:
A = [sin(t) 0;0 cos(t)];
B = [0.5; 0.0];
C = [1 0; 0 1];
G = ss(A,B,C,[]);
step(G,t)
x0 = [-1;0;2];
initial(G,x0)
以下是错误信息:
使用 horzcat 时出错 被连接的矩阵的维度不一致。
响应错误(第 11 行) A = [sin(t) 0;0 cos(t)];
对于矩阵A
依赖于变量t
(时间)的状态空间方程,如何获得阶跃或输出响应?
这是代码,它不起作用:
A = [sin(t) 0;0 cos(t)];
B = [0.5; 0.0];
C = [1 0; 0 1];
G = ss(A,B,C,[]);
step(G,t)
x0 = [-1;0;2];
initial(G,x0)
以下是错误信息:
使用 horzcat 时出错 被连接的矩阵的维度不一致。
响应错误(第 11 行) A = [sin(t) 0;0 cos(t)];
如前所述,您只能使用该ss
函数生成 LTI 系统,但您可以使用前向欧拉、后向欧拉、Tustin 等方法对模型进行分析离散化,并使用for
循环模拟您的模型。
对于您的示例,您可以运行如下内容:
h = 0.01
(如果动态没有被正确捕获,则更低);N
作为模拟的步数(100、1000 等);t = (0:N-1)*h
;创建一个for
计算系统状态和输出的循环,这里使用前向 Euler 方法(参见https://en.wikipedia.org/wiki/Euler_method):
% A = [sin(t) 0;0 cos(t)];
B = [0.5; 0.0];
C = [1 0; 0 1];
D = [0; 0];
x0 = [-1;1]; % the initial state must have two elements as this is a second-order system
u = 0; % constant zero input, but can be modified
N = 1000;
h = 0.01;
t = (0:N-1)*h;
x_vec = [];
y_vec = [];
xk = x0;
yk = [0;0];
for k=1:N
Ad = eye(2)+h*[sin(t(k)) 0; 0 cos(t(k))];
Bd = h*B; % C and D remain the same
yk = C*xk + D*u;
xk = Ad*xk + Bd*u;
x_vec = [x_vec, xk]; % keep results in memory
y_vec = [y_vec, yk];
end
% Plot output response
plot(t,y_vec);