# scipy.linalg.schur

scipy.linalg.schur(a, output='real', lwork=None, overwrite_a=False, sort=None, check_finite=True)

  Compute Schur decomposition of a matrix.

  The Schur decomposition is:

      A = Z T Z^H

  where Z is unitary and T is either upper-triangular, or for real Schur decomposition (output=’real’), quasi-upper triangular. In the quasi-triangular form, 2x2 blocks describing complex-valued eigenvalue pairs may extrude from the diagonal.

  Parameters:
    a(M, M) array_like

      Matrix to decompose

    output{‘real’, ‘complex’}, optional

      Construct the real or complex Schur decomposition (for real matrices).

    lwork int, optional

      Work array size. If None or -1, it is automatically computed.

    overwrite_a bool, optional

      Whether to overwrite data in a (may improve performance).

    sort{None, callable, ‘lhp’, ‘rhp’, ‘iuc’, ‘ouc’}, optional

      Specifies whether the upper eigenvalues should be sorted. A callable may be passed that, given a eigenvalue, returns a boolean denoting whether the eigenvalue should be sorted to the top-left (True). Alternatively, string parameters may be used:

          'lhp'   Left-hand plane (x.real < 0.0)
          'rhp'   Right-hand plane (x.real > 0.0)
          'iuc'   Inside the unit circle (x*x.conjugate() <= 1.0)
          'ouc'   Outside the unit circle (x*x.conjugate() > 1.0)

      Defaults to None (no sorting).

    check_finite bool, optional

      Whether to check that the input matrix contains only finite numbers. Disabling may give a performance gain, but may result in problems (crashes, non-termination) if the inputs do contain infinities or NaNs.

  Returns:
    T(M, M) ndarray

      Schur form of A. It is real-valued for the real Schur decomposition.

    Z(M, M) ndarray

      An unitary Schur transformation matrix for A. It is real-valued for the real Schur decomposition.

    sdim int

      If and only if sorting was requested, a third return value will contain the number of eigenvalues satisfying the sort condition.

  Raises:
    LinAlgError

      Error raised under three conditions:

      1. The algorithm failed due to a failure of the QR algorithm to compute all eigenvalues.

      2. If eigenvalue sorting was requested, the eigenvalues could not be reordered due to a failure to separate eigenvalues, usually because of poor conditioning.

      3. If eigenvalue sorting was requested, roundoff errors caused the leading eigenvalues to no longer satisfy the sorting condition.

  See also

  `rsf2csf`

    Convert real Schur form to complex Schur form

  Examples

      >>> import numpy as np
      >>> from scipy.linalg import schur, eigvals
      >>> A = np.array([[0, 2, 2], [0, 1, 2], [1, 0, 1]])
      >>> T, Z = schur(A)
      >>> T
      array([[ 2.65896708,  1.42440458, -1.92933439],
             [ 0.        , -0.32948354, -0.49063704],
             [ 0.        ,  1.31178921, -0.32948354]])
      >>> Z
      array([[0.72711591, -0.60156188, 0.33079564],
             [0.52839428, 0.79801892, 0.28976765],
             [0.43829436, 0.03590414, -0.89811411]])

      >>> T2, Z2 = schur(A, output='complex')
      >>> T2
      array([[ 2.65896708, -1.22839825+1.32378589j,  0.42590089+1.51937378j],
             [ 0.        , -0.32948354+0.80225456j, -0.59877807+0.56192146j],
             [ 0.        ,  0.                    , -0.32948354-0.80225456j]])
      >>> eigvals(T2)
      array([2.65896708, -0.32948354+0.80225456j, -0.32948354-0.80225456j])

  An arbitrary custom eig-sorting condition, having positive imaginary part, which is satisfied by only one eigenvalue

      >>> T3, Z3, sdim = schur(A, output='complex', sort=lambda x: x.imag > 0)
      >>> sdim
      1