# Strange output of a simple statespace model

The output of statespace model seems strange.

In the follwing code, the odes are governing equations of a three floors structure, and the output are three accelerations of floors.

If I understand statespace correctly, the output is simply obtained by using C matrix and D matrix as shown in the following code.

However, the result given by statespace model is wrong.

Am I using StateSpaceModel in a wrong way?

I am not sure if I state my problem clearly, sorry for my poor English.

Thanks.

 Remove["Global*"] // Quiet;
\[DoubleStruckCapitalM] = {{m1, 0, 0}, {0, m2, 0}, {0, 0,  m3}};
\[DoubleStruckCapitalK] = {{k11, k12, k13}, {k21, k22, k23}, {k31, k32, k33}};
\[DoubleStruckCapitalC] = {{c11, c12, c13}, {c21, c22, c23}, {c31, c32, c33}};
\[DoubleStruckCapitalB]\[DoubleStruckS] = {{1, -1, 0}, {0, 1, -1}, {0, 0, 1}};
\[DoubleStruckX] = {{x1[t]}, {x2[t]}, {x3[t]}};
uvec = {{u1[t]}, {u2[t]}, {u3[t]}};
\[CapitalLambda] = {{1}, {1}, {1}};
lhs = \[DoubleStruckCapitalM].D[\[DoubleStruckX], {t,2}] + \[DoubleStruckCapitalC].D[\[DoubleStruckX],t] + \[DoubleStruckCapitalK].\[DoubleStruckX] // Flatten;
rhs = \[DoubleStruckCapitalB]\[DoubleStruckS].uvec - \[DoubleStruckCapitalM].\[CapitalLambda] ddxg[t] // Flatten;
eq = lhs == rhs // Thread;

\[DoubleStruckZ] = {x1[t], x2[t], x3[t], x1'[t], x2'[t], x3'[t]};
\[DoubleStruckY] = {x1''[t], x2''[t], x3''[t]};
\[DoubleStruckU] = {u1[t], u2[t], u3[t], ddxg[t]};
ss = StateSpaceModel[eq, \[DoubleStruckZ], \[DoubleStruckU], \[DoubleStruckY], t];
{AA, BB, CC, DD} = Normal[ss];
ddxSS = CC.\[DoubleStruckZ] + DD.\[DoubleStruckU] // Flatten;
ddxEQ = {x1''[t], x2''[t], x3''[t]} /. Solve[eq, {x1''[t], x2''[t], x3''[t]}] // Flatten;
ddxSS - ddxEQ // Simplify(*this should be {0,0,0}*)


You can verify that the result from StateSpaceModel is correct by manually computing the transfer function and comparing it to the transfer function of the result.

With[{vars = LaplaceTransform[#[t], t, s] & /@ {x1, x2, x3}},
s^2 D[vars /. Solve[LaplaceTransform[eq, t, s], vars][[1]],
{LaplaceTransform[#[t], t, s] & /@ {u1, u2, u3, ddxg}}]] - TransferFunctionModel[ss][s]//
AllTrue[#, PossibleZeroQ, 2] &


True

The mistake in your verification is that you are assuming that the states of ss are also $$\mathbf{z}$$. You have a descriptor system that has been converted to a standard state-space form and the original states are lost.

To preserve the original structure set the option DescriptorStateSpace to True. Now you can see that eq appears in the last state equations and the states of the descriptor state-space representation are $$\left\{\text{x1}(t),\text{x1}'(t),\text{x1}''(t),\text{x2}(t),\text{x2}'(t),\text{x2}''(t ),\text{x3}(t),\text{x3}'(t),\text{x3}''(t)\right\}$$.

StateSpaceModel[eq, \[DoubleStruckZ], \[DoubleStruckU], \[DoubleStruckY], t, DescriptorStateSpace -> True]


eq // TableForm
`