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;