diff mftoolbox/sylvsol.m @ 0:8f23314345f4 draft

Create local repository for matrix toolboxes. Step #0 done.
author Antonio Pino Robles <data.script93@gmail.com>
date Wed, 06 May 2015 14:56:53 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mftoolbox/sylvsol.m	Wed May 06 14:56:53 2015 +0200
@@ -0,0 +1,39 @@
+function X = sylvsol(A,B,C)
+%SYLVSOL  Solve Sylvester equation.
+%   X = SYLSOL(A, B, C) is the solution to the Sylvester equation
+%   AX + XB = C, where A is m-by-m, B is n-by-n and C is m-by-n.
+%   Schur decompositions are used to convert to a (quasi)-triangular
+%   system.
+
+%   Reference:
+%   R. H. Bartels and G. W. Stewart.
+%   Algorithm 432: Solution of the matrix equation AX+XB=C.
+%   Comm. ACM, 15(9):820-826, 1972.
+
+[m,m] = size(A);
+[n,n] = size(B);
+
+realdata = (isreal(A) && isreal(B) && isreal(C));
+if ~isequal(A,triu(A)) || ~isequal(B,triu(B))
+
+   [Q, T] = schur(A,'complex');
+   [P, U] = schur(B,'complex');
+   C = Q'*C*P;
+   schur_red = 1;
+
+else
+
+   schur_red = 0;
+   T = A; U = B;
+
+end
+
+X = zeros(m,n);
+
+% Forward substitution.
+for i = 1:n
+    X(:,i) = (T + U(i,i)*eye(m)) \ (C(:,i) - X(:,1:i-1)*U(1:i-1,i));
+end
+
+if schur_red, X = Q*X*P'; end
+if realdata, X = real(X); end