diff --git a/control/config.py b/control/config.py index b4950ae5e..a81d8347f 100644 --- a/control/config.py +++ b/control/config.py @@ -226,4 +226,7 @@ def use_legacy_defaults(version): linearized_system_name_prefix='', linearized_system_name_suffix='_linearized') + # turned off _remove_useless_states + set_defaults('statesp', remove_useless_states=True) + return (major, minor, patch) diff --git a/control/statesp.py b/control/statesp.py index ff4c73c4e..0be783bce 100644 --- a/control/statesp.py +++ b/control/statesp.py @@ -72,7 +72,7 @@ # Define module default parameter values _statesp_defaults = { 'statesp.use_numpy_matrix': False, # False is default in 0.9.0 and above - 'statesp.remove_useless_states': True, + 'statesp.remove_useless_states': False, 'statesp.latex_num_format': '.3g', 'statesp.latex_repr_type': 'partitioned', } @@ -217,8 +217,7 @@ class StateSpace(LTI): __array_priority__ = 11 # override ndarray and matrix types def __init__(self, *args, **kwargs): - """ - StateSpace(A, B, C, D[, dt]) + """StateSpace(A, B, C, D[, dt]) Construct a state space object. @@ -228,6 +227,13 @@ def __init__(self, *args, **kwargs): True for unspecified sampling time). To call the copy constructor, call StateSpace(sys), where sys is a StateSpace object. + The `remove_useless_states` keyword can be used to scan the A, B, and + C matrices for rows or columns of zeros. If the zeros are such that a + particular state has no effect on the input-output dynamics, then that + state is removed from the A, B, and C matrices. If not specified, the + value is read from `config.defaults['statesp.remove_useless_states'] + (default = False). + """ # first get A, B, C, D matrices if len(args) == 4: @@ -251,8 +257,8 @@ def __init__(self, *args, **kwargs): "Expected 1, 4, or 5 arguments; received %i." % len(args)) # Process keyword arguments - remove_useless = kwargs.get( - 'remove_useless', + remove_useless_states = kwargs.get( + 'remove_useless_states', config.defaults['statesp.remove_useless_states']) # Convert all matrices to standard form @@ -321,7 +327,7 @@ def __init__(self, *args, **kwargs): raise ValueError("C and D must have the same number of rows.") # Check for states that don't do anything, and remove them. - if remove_useless: + if remove_useless_states: self._remove_useless_states() def _remove_useless_states(self): @@ -1274,7 +1280,7 @@ def _convert_to_statespace(sys, **kw): # Generate a simple state space system of the desired dimension # The following Doesn't work due to inconsistencies in ltisys: # return StateSpace([[]], [[]], [[]], eye(outputs, inputs)) - return StateSpace(0., zeros((1, inputs)), zeros((outputs, 1)), + return StateSpace([], zeros((0, inputs)), zeros((outputs, 0)), sys * ones((outputs, inputs))) # If this is a matrix, try to create a constant feedthrough diff --git a/control/tests/statesp_test.py b/control/tests/statesp_test.py index 8a91da68b..ccbd06881 100644 --- a/control/tests/statesp_test.py +++ b/control/tests/statesp_test.py @@ -395,9 +395,7 @@ def test_is_static_gain(self): D0 = 0 D1 = np.ones((2,1)) assert StateSpace(A0, B0, C1, D1).is_static_gain() - # TODO: fix this once remove_useless_states is false by default - # should be False when remove_useless is false - # print(StateSpace(A1, B0, C1, D1).is_static_gain()) + assert not StateSpace(A1, B0, C1, D1).is_static_gain() assert not StateSpace(A0, B1, C1, D1).is_static_gain() assert not StateSpace(A1, B1, C1, D1).is_static_gain() assert StateSpace(A0, B0, C0, D0).is_static_gain() @@ -586,10 +584,9 @@ def test_matrix_static_gain(self): def test_remove_useless_states(self): """Regression: _remove_useless_states gives correct ABC sizes.""" - g1 = StateSpace(np.zeros((3, 3)), - np.zeros((3, 4)), - np.zeros((5, 3)), - np.zeros((5, 4))) + g1 = StateSpace(np.zeros((3, 3)), np.zeros((3, 4)), + np.zeros((5, 3)), np.zeros((5, 4)), + remove_useless_states=True) assert (0, 0) == g1.A.shape assert (0, 4) == g1.B.shape assert (5, 0) == g1.C.shape pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy