schur#
- scipy.linalg.schur(a, output='real', lwork=None, overwrite_a=False, sort=None, check_finite=True)[source]#
- 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
- When the dtype of a is real, this specifies whether to compute the real or complex Schur decomposition. When the dtype of a is complex, this argument is ignored, and the complex Schur decomposition is computed. 
- lworkint, optional
- Work array size. If None or -1, it is automatically computed. 
- overwrite_abool, 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 an eigenvalue, returns a boolean denoting whether the eigenvalue should be sorted to the top-left (True). - If - output='complex'OR the dtype of a is complex, the callable should have one argument: the eigenvalue expressed as a complex number.
- If - output='real'AND the dtype of a is real, the callable should have two arguments: the real and imaginary parts of the eigenvalue, respectively.
 - Alternatively, string parameters may be used: - 'lhp' Left-hand plane (real(eigenvalue) < 0.0) 'rhp' Right-hand plane (real(eigenvalue) >= 0.0) 'iuc' Inside the unit circle (abs(eigenvalue) <= 1.0) 'ouc' Outside the unit circle (abs(eigenvalue) > 1.0) - Defaults to None (no sorting). 
- check_finitebool, 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. 
- sdimint
- If and only if sorting was requested, a third return value will contain the number of eigenvalues satisfying the sort condition. Note that complex conjugate pairs for which the condition is true for either eigenvalue count as 2. 
 
- Raises:
- LinAlgError
- Error raised under three conditions: - The algorithm failed due to a failure of the QR algorithm to compute all eigenvalues. 
- If eigenvalue sorting was requested, the eigenvalues could not be reordered due to a failure to separate eigenvalues, usually because of poor conditioning. 
- 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], # may vary [ 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]) # may vary - A custom eigenvalue-sorting condition that sorts by positive imaginary part is satisfied by only one eigenvalue. - >>> _, _, sdim = schur(A, output='complex', sort=lambda x: x.imag > 1e-15) >>> sdim 1 - When - output='real'and the array a is real, the sort callable must accept the real and imaginary parts as separate arguments. Note that now the complex eigenvalues- -0.32948354+0.80225456jand- -0.32948354-0.80225456jwill be treated as a complex conjugate pair, and according to the sdim documentation, complex conjugate pairs for which the condition is True for either eigenvalue increase sdim by two.- >>> _, _, sdim = schur(A, output='real', sort=lambda x, y: y > 1e-15) >>> sdim 2