Matlab code for this type of factorization.A has a SR decomposition A = SR , where S ∈ R^ 2n ×2n is a symplectic matrix, i.e. S ^TJS = J

4 Ansichten (letzte 30 Tage)
J=[0 -I;I 0] where I∈R^ n ×n means identity matrix. R=[R11 R12;R21 R22]∈ R^ 2n ×2n , is constituted by upper triangular matrices R11 , R12 , R22 and strictly upper triangular matrix R21. diag (R11 ) =|diag (R22 )| and diag (R12 ) = 0 , then the SR decomposition is unique.

Akzeptierte Antwort

Christine Tobler
Christine Tobler am 12 Feb. 2018
I'm not very acquainted with the SR decomposition (all I know about it I found just now by googling). I would suggest to take a look at what seems to be the original paper, "Matrix factorizations for symplectic QR-like methods" by Bunse-Gerstner. This seems to suggest an algorithm using other factorizations (e.g. QR) as building blocks.
I'm also tagging this Control, because it seems that this decomposition has applications in total control.
  1 Kommentar
Christine Tobler
Christine Tobler am 12 Feb. 2018
Also, take a look at the acknowledgements here: "On the sensitivity of the SR decomposition", Xiao-Wen Chang. They mention some MATLAB code for computing the SR decomposition being shared between researchers. Contacting one of them directly might be your best bet (although the paper is from 1998, so the code may not be easy to find).

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Farooq Aamir
Farooq Aamir am 20 Mär. 2018
if true
% code
end
function [c, v] = optsymhouse1(a)
twon = length(a); n = twon/2;
J = [zeros(n), eye(n); -eye(n), zeros(n)];
p = sign(a(1))*norm(a); aux = a(1)-p ;
if aux == 0
c = 0; v = zeros(twon, 1); %T = eye(twon);
elseif a(n + 1) == 0
display('division by zero');
return
else
v =a/aux;
c =aux^2/(p * a(n + 1));
v(1) = 1;
%T = (eye(twon) + c * v * v' * J);
end
function [c, v] =optsymhouse2(u)
twon = length(u); n = twon/2;
J = [zeros(n), eye(n); -eye(n), zeros(n)];
if n == 1
v = zeros(twon, 1); c = 0; %T = eye(twon);
else
I = [2 : n, n + 2 : twon]; e = norm(u(I));
if e == 0
v = zeros(twon, 1); c = 0; %T = eye(twon);
else
v1 = u(n + 1);
if v1 == 0
display('division by zero')
return
else
v = -u/e; v(1) = 1; v(n + 1) = 0; c = e/v1;
T = (eye(twon) + c * v * v' * J);
end
end
end
function[S,R] = SROSH(A)
[den, dep] = size(A);
n = den/2; p = dep/2;
v = zeros(den, 1);
JJ = [zeros(n) eye(n); -eye(n) zeros(n)];
S = eye(den);
for k = 1 : p
J= [zeros(n - k + 1), eye(n - k + 1); -eye(n - k + 1), zeros(n - k + 1)];
% Computing T 2k?1:
a = A([k : n, n + k : den],[k]);
[ c3,v3] = optsymhouse1(a);
T = eye(den-2*k+2) + c3*(v3*v3')*J ; % T not formed explicitly.
% Updating A:
A([k : n, n + k : den], [k : p, p + k : dep]) = T * A([k : n, n + k : den], [k : p, p + k :dep]);
% Computing T 2k?1 :
v(k : n) = v3( 1 : n - k + 1);
v(k + n : den) = v3(n -k + 2 : 2 * (n - k + 1));
TJ = eye(den) - c3*v*v'*JJ; % T J not formed explicitly;
% Updating S:
S = S * TJ;
% Computing T 2k:
u = A([k : n, n + k : den], p + k);
[ c3,v3] = optsymhouse2(u);
T = eye(den -2*k + 2) + c3 * (v3*v3')*J ; % T not formed explicitly.
% Updating A[:
A([k : n, n + k : den], [k : p, p + k : dep]) = T *A([k : n, n + k : den], [k : p, p + k :dep]);
% Computing T 2k:
v(k : n) = v3(1 : n - k + 1);
v(k + n : den) = v3(n - k + 2 : 2 * (n - k + 1));
TJ1 = (eye(den) - c3*(v*v')*JJ); % T J not formed explicitly;
% Updating S:
S = S * TJ1;
end
R = A;
%JJ'*S'*JJ*S = eye(2n);

Kategorien

Mehr zu Matrix Computations 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!

Translated by