It turns out to be easier than I thought. Given V such that A*V=V*E we find any W such that [W,V] is invertible and if A*W = W*F+V*G (i.e. [W,V]\A*[W,V] = [E,0;F,G] then setting U=W-V*X we solve the Sylvester equation E*X-X*F=G using lyap() and [U,V] block-diagonalizes A.
Block diagonalize a matrix
11 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Given a square matrix A and a rectangular matrix V, how do we find a complement U such that [U,V]\A*[U,V] is block diagonal?
For simplicity assume that V does not break any Jordan chains (i.e. v is in the span of V if and only if Av is in the span of V) so that the block sizes correspond to the number of columns of U and V. Here it would be enough to find a U such that [U,V] is invertible and A*U=U*C for some matrix C.
An interesting example that arises in probability theory is to calculate the limit B=(t-1)*inv(tI-A) as t->1 where A has a complete set of eigenvectors for 1. Considering the Jordan form of the matrix, A=W*blkdiag(J,I)/W, where 1 is not in eig(J), it's not hard to show that B=W*blkdiag(O,I)/W where O=zeros(size(J)). However the Jordan form is not numerically stable and we don't need all of it anyway.
The approach I'd prefer to use is to calculate V=null(A-I) and find the complement U that block diagonalizes A, which gives a similar expression for B.
Small example:
A=[0,0,0;1/2,1,0;1/2,0,1];
% Jordan method (works for small examples):
[W,J]=jordan(A);
J(J~=1 | ~eye(size(J)))=0;
B = W*J/W; % here B=A
% Block diagonalization (computed partly by hand, wish to generalize):
V=null(A-eye(size(A)));
U=[1;-1/2;-1/2]; % in general U=???
B=[U,V]*diag([zeros(1,size(U,2)),ones(1,size(V,2))])/[U,V]; % here B=A
0 Kommentare
Antworten (1)
Siehe auch
Kategorien
Mehr zu Linear Algebra finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!