Rearrange state space system

37 views (last 30 days)
Adam Evans
Adam Evans on 14 Dec 2020
Commented: Adam Evans on 15 Dec 2020
I've modelled a system in simulink and used operspec and linearise to extract a state space system. While the activity has worked well, I have a downstream process which requires the state space to be expressed in a different form.
Without modifying the simulink model, is there a matlab command or series of commands that is capable of rearranging a state space system such that some parameters which where previously ouputs become states. For context, my downstream process will also be dropping a number of states.
I've been using simulink, simulink control, system identification and the control system toolbox.

Accepted Answer

Paul
Paul on 14 Dec 2020
Let's assume that the state space model from Simulink is defined as:
xdot = A*x + B*u
[y1;y2] = [C1; C2] * x + [0;D2] u
where y1 are the outputs that you want to be state variables (you can always order the ouputs this way) and all matrices are of compatible dimensions. Note that D1 == 0.
Now we have at least two options.
The first option is to add additional states (w) with derivatives equal to the derivatives of the outputs
w = y1
wdot = y1dot = C1*xdot = C1*A*x + C1*B*u.
Now we can augment the state vector x witht the new states w. By definition, the new outputs that replace y1 are just w. Hence the new state space model is:
[xdot;wdot] = [A 0;C1*A 0] * [x;w] + [B;C1*B] * u
[ynew;y2] = [0 I;C2 0] * [x;w] + [0;D] * u
where the zero and identity matrices are of approropriate dimension. The result will be a non--minimal state space realization that preseves the original states, retains the input/output transfer function from u to y, and has outputs ynew that are state variables.
Here's an example.
First, define some state space model
>> sys1 = minreal(ss(zpk([tf(1,[1 1]);tf(1,conv([1 1],[1 2]));tf(1,conv([1 1],[1 3]))])))
sys1 =
A =
x1 x2 x3
x1 -2.067 -0.2775 -0.1388
x2 0.2401 -1.212 0.894
x3 0.03861 0.5588 -2.721
B =
u1
x1 0.9679
x2 0.6052
x3 1.303
C =
x1 x2 x3
y1 0.1629 0.6703 0.3352
y2 -0.6095 0.4695 0.2348
y3 0.06517 0.4681 -0.2659
D =
u1
y1 0
y2 0
y3 0
Continuous-time state-space model.
Let's look at its transfer function matrix in zpk form (note the cancellations in the individual elements):
>> zpk(sys1)
ans =
From input to output...
(s+2) (s+3)
1: -----------------
(s+2) (s+3) (s+1)
(s+3)
2: -----------------
(s+2) (s+3) (s+1)
(s+2)
3: -----------------
(s+2) (s+3) (s+1)
Continuous-time zero/pole/gain model.
Now defne a new state space realization using the augmented state vector and check its transfer function in zpk form:
>> sys2=ss([[sys1.a ; sys1.c(1:2,:)*sys1.a] zeros(5,2)],[sys1.b;sys1.c(1:2,:)*sys1.b],[zeros(2,3) eye(2);sys1.c(3,:) zeros(1,2)],[zeros(2,1);sys1.d(3,:)]);
>> zpk(sys2)
ans =
From input to output...
s (s+2) (s+3)
1: -------------------
s (s+3) (s+2) (s+1)
s (s+3)
2: -------------------
s (s+3) (s+2) (s+1)
(s+2)
3: -----------------
(s+3) (s+2) (s+1)
Continuous-time zero/pole/gain model.
The transfer function matrices are the same (after cancellation), but additional poles at the origin show up because of the non-minimal realization. As must be the case, the first two outputs are state variables.
>> sys2.c
ans =
0 0 0 1.0000e+00 0
0 0 0 0 1.0000e+00
6.5167e-02 4.6814e-01 -2.6593e-01 0 0
Another option is to define a new state vector (z) that is a linear combination of the original state vector (x) such that elements of z are the outputs that we want to be states. In other words
z = Tx = [C1; V] *x
where it is assumed that C1 has full row rank and that a matrix V can be found such that T is invertible. I'm pretty sure (not positive) that such a V can always be found. If we further assume that each row of C1 has a non-zero element in more than one column, then one option is to choose V such that each row of V is zero except in one column (different columns for each row). If this is assumption is not true, then it still should be easy to find a V.
Here we define T such that the first two states are the desired outputs and the third state is preserved.
>> T=[sys1.c(1:2,:);[0 0 1]]
T =
1.6292e-01 6.7034e-01 3.3517e-01
-6.0951e-01 4.6951e-01 2.3476e-01
0 0 1.0000e+00
Verify that T is invertible.
>> rank(T)
ans =
3
This tansformation T is called a similarity transformation and can used to define a new realization in terms of z (instead of x)
>> sys3=ss2ss(sys1,T)
sys3 =
A =
x1 x2 x3
x1 -1 -4.857e-17 -4.441e-16
x2 1 -2 -4.441e-16
x3 0.7396 0.1343 -3
B =
u1
x1 1
x2 2.116e-16
x3 1.303
C =
x1 x2 x3
y1 1 0 -5.551e-17
y2 0 1 0
y3 0.6513 0.06717 -0.5
D =
u1
y1 0
y2 0
y3 0
Continuous-time state-space model.
>> zpk(sys3)
ans =
From input to output...
(s+2) (s+3)
1: -----------------
(s+1) (s+2) (s+3)
(s+3)
2: -----------------
(s+1) (s+2) (s+3)
(s+2)
3: -----------------
(s+1) (s+2) (s+3)
Continuous-time zero/pole/gain model.
As expected, the first two outputs of sys3 are now state variables and the transfer function matrix of sys3 is the same as that of sys1.
  1 Comment
Adam Evans
Adam Evans on 15 Dec 2020
That's brilliant. Thank you very the very detailed response!

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!