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}*)
Answer
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
Comments
Post a Comment