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.


 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}*)

code picture


1 Answer 1


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] &


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

enter image description here


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.