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.
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.