SylvesterEquationSchur

Решает уравнение Сильвестра для вещественных квазитреугольных или комплексных треугольных матриц:

   A*X + X*B = C

где A и B — верхнетреугольные матрицы. A имеет размер m на m, а B — n на n. Правая часть C и решение X имеют размер m на n.

Матрицы A и B должны быть представлены в канонической форме Шура (как возвращают функции EigenHessenbergSchurQ или EigenSolverSchur). Для вещественных квазитреугольных матриц это блочно-верхнетреугольная форма с диагональными блоками 1×1 и 2×2; при этом каждый блок 2×2 имеет равные диагональные элементы и внедиагональные элементы противоположных знаков.

LAPACK-функция TRSYL.

Вычисления для типа matrix<double>

bool  matrix::SylvesterEquationSchur(
   matrix&              B,            // матрица B в форме Шура
   matrix&              QA,           // ортогональная матрица векторов Шура исходной матрицы A
   matrix&              QB,           // ортогональная матрица векторов Шура матрицы B
   matrix&              C,            // матрица правой части C
   matrix&              X             // матрица решений X
   );

Вычисления для типа matrix<float>

bool  matrixf::SylvesterEquationSchur(
   matrixf&             B,            // матрица B в форме Шура
   matrixf&             QA,           // ортогональная матрица векторов Шура исходной матрицы A
   matrixf&             QB,           // ортогональная матрица векторов Шура матрицы B
   matrixf&             C,            // матрица правой части C
   matrixf&             X             // матрица решений X
   );

Вычисления для типа matrix<complex>

bool  matrix::SylvesterEquationSchur(
   matrixc&             B,            // матрица B в форме Шура
   matrixc&             QA,           // ортогональная матрица векторов Шура исходной матрицы A
   matrixc&             QB,           // ортогональная матрица векторов Шура матрицы B
   matrixc&             C,            // матрица правой части C
   matrixc&             X             // матрица решений X
   );

Вычисления для типа matrix<complexf>

bool  matrix::SylvesterEquationSchur(
   matrixcf&            B,            // матрица B в форме Шура
   matrixcf&            QA,           // ортогональная матрица векторов Шура исходной матрицы A
   matrixcf&            QB,           // ортогональная матрица векторов Шура матрицы B
   matrixcf&            C,            // матрица правой части C
   matrixcf&            X             // матрица решений X
   );

Параметры

B

[in]  Вещественная квазитреугольная или комплексная треугольная матрица B в форме Шура (выходной параметр schur_matrix в EigenSolverSchur или schur_t в EigenHessenbergSchurQ)

QA

[in]  Вещественная ортогональная или комплексная унитарная матрица векторов Шура исходной матрицы A (выходной параметр schur_vectors в EigenSolverSchur или schur_z в EigenHessenbergSchurQ)

QB

[in]  Вещественная ортогональная или комплексная унитарная матрица векторов Шура исходной матрицы A (выходной параметр schur_vectors в EigenSolverSchur или schur_z в EigenHessenbergSchurQ)

C

[in]  Матрица C, столбцы которой представляют собой правые части систем линейных уравнений.

X

[out] Матрица X с решением уравнения Сильвестра.

 

Возвращаемое значение

Возвращает true в случае успеха, иначе false в случае ошибки.

Примечание

Выходная матрица X имеет те же размеры, что и входная матрица C.

Функция TRSYL обрабатывает только верхнетреугольные матрицы A и B. Для того, чтобы вычислить уравнение Сильвестра для любых квадратных матриц, необходимо предварительно использовать разложение Шура. Например, имеем 2 обычные матрицы A и B, тогда получаем две пары матриц разложения Шура:

A.EigenSolverShur(EIGSCHUR_V,EV,SA,QA);

B.EigenSolverShur(EIGSCHUR_V,EV,SB,QB);

и решаем уравнение Сильвестра:

SA.SylvesterEquationSchur(SB,QA,QB,C,X);