LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
solveSylvPowersRealSchur_FW.m
1function Y = solveSylvPowersRealSchur_FW(A, B, C)
2% X = solveSylvPowersRealSchur_FW() solves the equation
3% sum_{j=1}^N B_j Y A^{j-1} = C
4% A: m x m
5% B = [B_1 B_2 ... B_N], B_j: n x n
6% C = n x m
7
8m = size(A,1);
9n = size(B,1);
10N = size(B,2)/n;
11
12[U,T] = schur(A,'real');
13
14E = C*U;
15
16Tvec = zeros(m,N*m);
17Tvec(:,1:m) = eye(m);
18Tvec(:,m+1:2*m) = T;
19for i = 2:N-1
20 Tvec(:,i*m+1:(i+1)*m) = Tvec(:,(i-1)*m+1:i*m)*T;
21end
22
23%Z: matrix coeff of X_k
24X = zeros(n*m,1);
25k=1;
26Bold = B;
27B = reshape(B, n^2, N);
28Tvec = reshape(Tvec, m^2, N)';
29epsilon = 10e-14;
30while k <=m-1
31 if abs(T(k+1,k)) < epsilon
32 if k > 1
33 W = reshape(B*Tvec(:,(k-1)*m+1:(k-1)*m+k-1), n,n*(k-1))*X(1:n*(k-1));
34 else
35 W = zeros(n,1);
36 end
37 Z = reshape(B*Tvec(:,(k-1)*m+k), n, n);
38
39 X(n*(k-1)+1:n*k) = Z\‍(E(:,k) - W);
40 k = k+1;
41 else
42 if k > 1
43 W = [ reshape(B*Tvec(:,(k-1)*m+1:(k-1)*m+k-1), n, n*(k-1))*X(1:n*(k-1));
44 reshape(B*Tvec(:,k*m+1:k*m+k-1), n, n*(k-1))*X(1:n*(k-1))];
45 else
46 W = zeros(2*n,1);
47 end
48 Z = [ reshape(B*Tvec(:,(k-1)*m+k), n, n) reshape(B*Tvec(:,(k-1)*m+k+1), n, n);
49 reshape(B*Tvec(:,k*m+k), n, n) reshape(B*Tvec(:,k*m+k+1), n, n)];
50
51 X(n*(k-1)+1:n*(k+1)) = Z\‍([E(:,k);E(:,k+1)] - W);
52 k = k+2;
53 end
54end
55
56if k == m
57 W = reshape(B*Tvec(:,(k-1)*m+1:(k-1)*m+k-1), n, n*(k-1))*X(1:n*(k-1));
58 Z = reshape(B*Tvec(:,(k-1)*m+k), n, n);
59 X(n*(k-1)+1:n*k) = Z\‍(E(:,k) - W);
60end
61
62Y = reshape(X,n,m)*U';