Skip to main content
`Ctrl`+`K`
scipy.signal.

# StateSpace

class scipy.signal.StateSpace(*system, dt=None)

  Linear Time Invariant system in state-space form.

  Represents the system as the continuous-time, first order differential equation \(\dot{x} = A x + B u\) or the discrete-time difference equation \(x[k+1] = A x[k] + B u[k]\). `StateSpace` systems inherit additional functionality from the `lti`, respectively the `dlti` classes, depending on which system representation is used.

  Parameters:
    *system arguments

      The `StateSpace` class can be instantiated with 1 or 4 arguments. The following gives the number of input arguments and their interpretation:

      - 1: `lti` or `dlti` system: (`StateSpace`, `TransferFunction` or `ZerosPolesGain`)

      - 4: array_like: (A, B, C, D)

    dt float, optional

      Sampling time [s] of the discrete-time systems. Defaults to None (continuous-time). Must be specified as a keyword argument, for example, `dt=0.1`.

  Attributes:
    `A`

      State matrix of the `StateSpace` system.

    `B`

      Input matrix of the `StateSpace` system.

    `C`

      Output matrix of the `StateSpace` system.

    `D`

      Feedthrough matrix of the `StateSpace` system.

    `dt`

      Return the sampling time of the system, None for `lti` systems.

    `poles`

      Poles of the system.

    `zeros`

      Zeros of the system.

  Methods

  `__add__`(other) | Adds two systems in the sense of frequency domain addition.
  `__mul__`(other) | Post-multiply another system or a scalar
  `__rmul__`(other) | Pre-multiply a scalar or matrix (but not StateSpace)
  `__truediv__`(other) | Divide by a scalar
  `to_ss`() | Return a copy of the current `StateSpace` system.
  `to_tf`(**kwargs) | Convert system representation to `TransferFunction`.
  `to_zpk`(**kwargs) | Convert system representation to `ZerosPolesGain`.

  See also

  `TransferFunction`, `ZerosPolesGain`, `lti`, `dlti`
  `ss2zpk`, `ss2tf`, `zpk2sos`

  Notes

  If the parameter system is a tuple (A, B, C, D) with four state space matrices, then those matrices are converted into two-dimensional arrays of the same dtype by calling `abcd_normalize`. The resulting dtype will be based on NumPy’s dtype promotion rules, except in the case where each of `A`, `B`, `C`, and `D` has integer dtype, in which case the resulting dtype will be the default floating point dtype of `float64`.

  Changing the value of properties that are not part of the `StateSpace` system representation (such as `zeros` or `poles`) is very inefficient and may lead to numerical inaccuracies. It is better to convert to the specific system representation first. For example, call `sys = sys.to_zpk()` before accessing/changing the zeros, poles or gain.

  The State-space system representation section of the SciPy User Guide presents the corresponding definitions of continuous-time and disrcete time state space systems.

  Examples

      >>> from scipy import signal
      >>> import numpy as np
      >>> a = np.array([[0, 1], [0, 0]])
      >>> b = np.array([[0], [1]])
      >>> c = np.array([[1, 0]])
      >>> d = np.array([[0]])

      >>> sys = signal.StateSpace(a, b, c, d)
      >>> print(sys)
      StateSpaceContinuous(
      array([[0., 1.],
             [0., 0.]]),
      array([[0.],
             [1.]]),
      array([[1., 0.]]),
      array([[0.]]),
      dt: None
      )

      >>> sys.to_discrete(0.1)
      StateSpaceDiscrete(
      array([[1. , 0.1],
             [0. , 1. ]]),
      array([[0.005],
             [0.1  ]]),
      array([[1., 0.]]),
      array([[0.]]),
      dt: 0.1
      )

      >>> a = np.array([[1, 0.1], [0, 1]])
      >>> b = np.array([[0.005], [0.1]])

      >>> signal.StateSpace(a, b, c, d, dt=0.1)
      StateSpaceDiscrete(
      array([[1. , 0.1],
             [0. , 1. ]]),
      array([[0.005],
             [0.1  ]]),
      array([[1., 0.]]),
      array([[0.]]),
      dt: 0.1
      )