Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %Factorizarea Givens aplicata unei matrice superior Hessenberg
- function [Q R] = GivensHessenberg(H)
- %A - matrice superior Hessenberg
- [n, n] = size(H);
- c = zeros(n-1, 1);
- s = zeros(n-1, 1);
- for k=1:n-1
- [c(k), s(k)] = rotatieGivens(H(k, k), H(k+1,k));
- H = triunghiularizare(H, c(k), s(k), k, k+1, k, n);
- end
- R = H;
- Q = ortogonalizare(c, s, n);
- end
- function R = triunghiularizare(H, c, s, i, k, j1, j2)
- for j=j1:j2
- t1 = H(i, j);
- t2 = H(k, j);
- H(i, j) = c*t1-s*t2;
- H(k, j) = s*t1+c*t2;
- end
- R = H;
- end
- function Q = ortogonalizare(c, s, n)
- n1 = n-1;
- Q = eye(n);
- Q(n1, n1) = c(n1);
- Q(n, n) = c(n1);
- Q(n1, n) = s(n1);
- Q(n, n1) = -s(n1);
- for k=n-2:-1:1
- k1 = k+1;
- Q(k, k) = c(k);
- Q(k1, k) = -s(k);
- q = Q(k1, k1:n);
- Q(k, k1:n) = s(k)*q;
- Q(k1, k1:n) = c(k)*q
- end
- end
- function [c,s] = rotatieGivens(a,b)
- if b == 0
- c = 1;
- s = 0;
- else
- if abs(b) > abs(a)
- r = -a / b;
- s = 1 / sqrt(1 + r^2);
- c = s*r;
- else
- r = -b / a;
- c = 1 / sqrt(1 + r^2);
- s = c*r;
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment