# ModelingToolkit.jl state-space representations -- what is the recommendation?

What is the best way to represent a state space system in ModelingToolkit? For example

``````@variables t x1(t) x2(t) u(t) y(t)
@constants a11 = -1 a12 = 0.1a21 = 0 a22 = -1 b1 = 1 b2 = 0 c1 = 1 c2 = 1
D = Differential(t)
eqs = [D(x1) ~ a11*x1 + a12*x2 + b1*u,
D(x2) ~ a21*x1 + a22*x2 + b2*u]
``````
1. When I try to add the y = c1x1 + c2x2 equation, I run into an error (The LHS cannot contain nondifferentiated variables. Please run `structural_simplify`) and following the suggestion to use structural_simplify gives me an ExtraVariablesSystemException. Is this not intended to be supported; therefore, without any output feedback, I would compute y separately?
2. I’ve seen elsewhere that the equations can be written as a matrix differential equation, but I get an error about unknown axes for x.

Are there any simple examples of doing this?

It looks like you’re talking about linear statespace systems? If that’s the case, check out GitHub - JuliaControl/ControlSystemsMTK.jl: Interface between ControlSystems and ModelingToolkit

The answer from @baggepinnen above is the correct “I want to solve a problem answer”. Here is the “I want to build this myself” answer.

The reason you get an error is that `u(t)` is unspecified. When you apply `structural_simplify`, all the pieces of the system must be in place.

The way to debug this is to run

``````partial_sys = structural_simplify(sys; check_consistency=false)
``````

You can then compare `states(partial_sys)` to `equations(partial_sys)`, and immediately notice that there is no expression for `u`.

Here is one possible approach:

``````function build_system()
sts = @variables t x(t)[1:2] u(t) y(t)
ps = @parameters a[1:2,1:2]=[-1 0.1; 0 -1] b[1:2]=[1 0] c[1:2]=[1 1]
D = Differential(t)

eqs = [D.(x) .~ a * x + b .* u
y ~ c' * x
u ~ sin(t)
]

sys = ODESystem(eqs, t; name=:test)

sys = structural_simplify(sys)
end
``````
2 Likes

Thank you guys so much! This is exactly what I needed.