StateSpace constructor should not call _remove_useless_states
See original GitHub issueState space representations should, in my opinion, not be reduced automatically with StateSpace._remove_useless_states(), similar to the fact that we don’t call minreal() automatically.
Unlike transfer functions, state space models can model non-observable or non-controllable behaviour, and cannot always be considered equivalent to their minimized form. Additionally, it is rather confusing to have ss(A,B,C,D).A !== A and e.g. ss(A,B,C,D).sample(T).A !== expm(A*T). For a more object-oriented interface, it would also be great to have member functions like stateSpace.isControllable(), which do not make sense if the system has already been minimized.
To give an example: The autonomous system x’=0, y=x is a signal model for the constant output y=x(0). It is not equivalent to the system y=0 if you consider the initial response for x(0) !== 0.
import control
print(control.__version__)
print(control.ss(0,0,1,0)) # expected: A,B,C,D unchanged from input
print(control.ss(0,0,1,0).sample(1)) # expected: ss(1,0,1,0, dt=1)
output:
0.8.0
A = []
B = []
C = []
D = [[0]]
A = []
B = []
C = []
D = [[0]]
dt = 1
Is there a reason for the current behavior, or would it be okay to change it?
Issue Analytics
- State:
- Created 5 years ago
- Comments:8 (6 by maintainers)

Top Related StackOverflow Question
Found something unexpected in the way that the
feedbackfunction was implemented: if you pass a constant as one of the arguments forfeedback(eg,feedback(P*C, 1)) then the constant was being converted to a state space system with a single state and B=0, C=0. This gives the right input/output response, but created an unobservable/uncontrollable (= “useless”) state. This generated a half dozen or so errors when I switchedremove_useless_statestoFalsesince systems had an “extra” state.By changing the
statesp._convert_to_state_spacefunction to create a state space with no state (A = []) the problem went away and all but one unit test passed. That unit test was explicitly testing that useless states were removed, so had to passremove_useless_states=Trueto make that happen.With that fix, everything appears to work. PR coming as soon as I confirm via CI.
Fixed in #509.