Home > . > sylvester3.m

sylvester3

PURPOSE ^

solves a*x+b*x*c=d

SYNOPSIS ^

function x=sylvester3(a,b,c,d)

DESCRIPTION ^

 solves a*x+b*x*c=d

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 % solves a*x+b*x*c=d
0002 function x=sylvester3(a,b,c,d)
0003   n = size(a,1);
0004   m = size(c,1);
0005   if n == 1
0006     x=d./(a*ones(1,m)+b*c);
0007     return
0008   end
0009   if m == 1
0010     x = (a+c*b)\d;
0011     return;
0012   end
0013   x=zeros(n,m);
0014   [u,t]=schur(c);
0015   [aa,bb,qq,zz]=qz(full(a),full(b),'real'); % available in Matlab version 6.0
0016   d=qq*d*u;
0017   i = 1;
0018   while i < m
0019     if t(i+1,i) == 0
0020       if i == 1
0021     c = zeros(n,1);
0022       else
0023     c = bb*(x(:,1:i-1)*t(1:i-1,i));
0024       end
0025       x(:,i)=(aa+bb*t(i,i))\(d(:,i)-c);
0026       i = i+1;
0027     else
0028       if i == n
0029     c = zeros(n,1);
0030     c1 = zeros(n,1);
0031       else
0032     c = bb*(x(:,1:i-1)*t(1:i-1,i));
0033     c1 = bb*(x(:,1:i-1)*t(1:i-1,i+1));
0034       end
0035       z = [aa+bb*t(i,i) bb*t(i+1,i); bb*t(i,i+1) aa+bb*t(i+1,i+1)]...
0036       \[d(:,i)-c;d(:,i+1)-c1];
0037       x(:,i) = z(1:n);
0038       x(:,i+1) = z(n+1:end);
0039       i = i + 2;
0040     end
0041   end
0042   if i == m
0043     c = bb*(x(:,1:m-1)*t(1:m-1,m));
0044     x(:,m)=(aa+bb*t(m,m))\(d(:,m)-c);
0045   end
0046   x=zz*x*u';
0047   
0048 % 01/25/03 MJ corrected bug for i==m (sign of c in x determination)
0049 % 01/31/03 MJ added 'real' to qz call

Generated on Fri 16-Jun-2006 09:09:06 by m2html © 2003