0
$\begingroup$

Let $$ A X + X B = C $$ be the Sylvester equation when $A,B,C \in \mathbb{C}^{n \times n}$ are complex matrices. I want to solve it for $X$. Python's SciPy package $\texttt{solve_sylvester}$ function uses the Bartels-Stewart algorithm, which according to Wikipedia starts with a real Schur decomposition.

When I just call the function $\texttt{solve_sylvester}$ it seems to work even when the matrices are complex. But what is the meaning of a real Schur decomposition to a complex matrix $Y \in \mathbb{C}^{n \times n}$?

A special case of this question is when $A,B$ are hermitian positive-definite matrices and $C = x \cdot x^H$ is hermitian rank-1 matrix. If in the general case the Bartels-Stewart algorithm is meaningless or not working properly, is it true even for this special case?

$\endgroup$
1

1 Answer 1

0
$\begingroup$

I can confirm that Bartel-Stewart's method uses the complex Schur form if at least one of the matrices $A$ and $B$ are complex. I imagine that your Python implementation is built on top of LAPACK and will ultimately call the LAPACK solver ZTRSYL (complex, double precision) or CTRSYL (complex, single precision).

In general, it is desirable to have both real and complex flavors of all subroutines. In some cases, the translation from a complex to a real subroutine is almost trivial and consists mainly of replacing complex data types with real data types and change the definition of the elementary arithmetic operations. The standard example is matrix matrix multiplication, xGEMM in LAPACK.

However, in all cases involving the Schur form of a matrix or a matrix pencil it is necessary to develop separate functions for the real and complex cases. This applies to the standard and generalized eigenvalue problems as well as the Lyapunov and Sylvester matrix equations. In general, the real cases are harder to program and optimize, because there are more special cases and you cannot partition your matrices at will because you do not want the complications arising from splitting a 2-by-2 block across multiple tiles.

$\endgroup$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .