why lsim return empty states?
6 ビュー (過去 30 日間)
古いコメントを表示
I have build a sparse state space system, and solved using lsim. According to the documentation, the third output represent the state trajectory.
When I run this example, the third output is empty.
Is there anything wrong I am doing? how can I get the states with time?
Thanks!
% inputs defining sparse state space system size
N_inputs = 41;
N_outputs = 240;
N_states = 2400;
N_time_steps = 10;
% defining the sparse state space system
G = sprand(N_states, N_states, 0.01);
B = sprand(N_states, N_inputs, 0.01);
E = sprand(N_outputs, N_states, 0.01);
D = 0;
C = sprand(N_states, N_states, 0.01);
sys = sparss(G, B, E, D, C);
% solving
t = linspace(0,1,N_time_steps);
[y,tOut,x] = lsim( ...
sys, ...
rand(N_inputs, length(t)), ...
t);
% check the size of each output
disp(size(y))
disp(size(tOut))
disp(size(x)) % why this is empty? how can I force lsim to return it?
0 件のコメント
採用された回答
Paul
2023 年 7 月 28 日
編集済み: Paul
2023 年 7 月 28 日
According to the lsim doc page, the output x is returned when the input sys is a state-space model. The doc page further distinguishes between the input sys being a sparss model and an ss model. So I think that state trajectories are just returned as empty for sparss input. You can also see a comment that says exactly this if you drill down far enough into lsim in the debugger.
dbtype(fullfile(matlabroot,'toolbox/shared/controllib/engine/+ltipack/@spssdata/lsim.m'),'1:8')
In theory, at least, we can augment the output equation to include the states.
rng(100)
N_inputs = 41;
N_outputs = 240;
N_states = 2400;
N_time_steps = 10;
% defining the sparse state space system
G = sprand(N_states, N_states, 0.01);
B = sprand(N_states, N_inputs, 0.01);
E = sprand(N_outputs, N_states, 0.01);
D = 0;
C = sprand(N_states, N_states, 0.01);
% augment
E = [E; sparse(eye(N_states))];
sys = sparss(G, B, E, D, C);
% solving
t = linspace(0,1,N_time_steps);
[y,tOut,x] = lsim( ...
sys, ...
rand(N_inputs, length(t)), ...
t);
% collect states and outputs
x = y(:,N_outputs+1:end);
y = y(:,1:N_outputs);
size(y)
size(x)
2 件のコメント
Paul
2023 年 7 月 28 日
The doc could definitely be more clear in this regard. If you feel motivated, you can click on a star rating at the bottom of the doc page, after which I think that a window will pop-up where you can provide feedback to the doc writers.
その他の回答 (0 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!