To = Matrices.Utilities.reorderRSF(T, Q, alphaReal, alphaImag); (To, Qo, wr, wi) = Matrices.Utilities.reorderRSF(T, Q, alphaReal, alphaImag, iscontinuous);
Function reorderRSF() reorders a real Schur form such that the stable eigenvalues of
the system are in the 1-by-1 and 2-by-2 diagonal blocks of the block upper triangular matrix.
If the Schur form is referenced to a continuous system the staple eigenvalues are in the left complex half plane.
The stable eigenvalues of a discrete system are inside the complex unit circle.
This function is used for example to solve algebraic Riccati equations
(continuousRiccati,
discreteRiccati). In this context the Schur form
as well as the corresponding eigenvalues and the transformation matrix Q are known, why the eigenvalues and the transformation matrix are inputs to reorderRSF().
The Schur vector matrix Qo is also reordered according to To. The vectors wr and wi contains the real and imaginary parts of the
reordered eigenvalues respectively.
T := [-1,2, 3,4; 0,2, 6,5; 0,0,-3,5; 0,0, 0,6]; To := Matrices.Utilities.reorderRSF(T,identity(4),{-1, 2, -3, 6},{0, 0, 0, 0}, true); // To = [-1.0, -0.384, 3.585, 4.0; // 0.0, -3.0, 6.0, 0.64; // 0.0, 0.0, 2.0, 7.04; // 0.0, 0.0, 0.0, 6.0]
See also Matrices.realSchur
function reorderRSF extends Modelica.Icons.Function; import Modelica.Math.Matrices.LAPACK; input Real T[:, :] "Real Schur form"; input Real Q[:, size(T, 2)] "Schur vector Matrix"; input Real alphaReal[size(T, 1)] "Real part of eigenvalue=alphaReal+i*alphaImag"; input Real alphaImag[size(T, 1)] "Imaginary part of eigenvalue=alphaReal+i*alphaImag"; input Boolean iscontinuous = true "= true, if the according system is continuous. False for discrete systems"; output Real To[size(T, 1), size(T, 2)] "Reordered Schur form"; output Real Qo[size(T, 1), size(T, 2)] "Reordered Schur vector matrix"; output Real wr[size(T, 2)] "Reordered eigenvalues, real part"; output Real wi[size(T, 2)] "Reordered eigenvalues, imaginary part"; end reorderRSF;