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

3 visualizzazioni (ultimi 30 giorni)
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.

Risposta accettata

Christine Tobler
Christine Tobler il 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 Commento
Christine Tobler
Christine Tobler il 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).

Accedi per commentare.

Più risposte (1)

Farooq Aamir
Farooq Aamir il 20 Mar 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);

Categorie

Scopri di più su Linear Algebra in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by