mihainan

Nan Mihai - Partial MN

Apr 10th, 2014
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 1.27 KB | None | 0 0
  1. %Factorizarea Givens aplicata unei matrice superior Hessenberg
  2. function [Q R] = GivensHessenberg(H)
  3.     %A - matrice superior Hessenberg
  4.     [n, n] = size(H);
  5.     c = zeros(n-1, 1);
  6.     s = zeros(n-1, 1);
  7.     for k=1:n-1
  8.         [c(k), s(k)] = rotatieGivens(H(k, k), H(k+1,k));
  9.         H = triunghiularizare(H, c(k), s(k), k, k+1, k, n);
  10.     end
  11.     R = H;
  12.     Q = ortogonalizare(c, s, n);
  13. end
  14.  
  15. function R = triunghiularizare(H, c, s, i, k, j1, j2)
  16.     for j=j1:j2
  17.         t1 = H(i, j);
  18.         t2 = H(k, j);
  19.         H(i, j) = c*t1-s*t2;
  20.         H(k, j) = s*t1+c*t2;
  21.     end
  22.     R = H;
  23. end
  24.  
  25. function Q = ortogonalizare(c, s, n)
  26.     n1 = n-1;
  27.     Q = eye(n);
  28.     Q(n1, n1) = c(n1);
  29.     Q(n, n) = c(n1);
  30.     Q(n1, n) = s(n1);
  31.     Q(n, n1) = -s(n1);
  32.     for k=n-2:-1:1
  33.         k1 = k+1;
  34.         Q(k, k) = c(k);
  35.         Q(k1, k) = -s(k);
  36.         q = Q(k1, k1:n);
  37.         Q(k, k1:n) = s(k)*q;
  38.         Q(k1, k1:n) = c(k)*q
  39.     end
  40. end
  41.  
  42. function [c,s] = rotatieGivens(a,b)
  43.     if b == 0
  44.         c = 1;
  45.         s = 0;
  46.     else
  47.         if abs(b) > abs(a)
  48.             r = -a / b;
  49.             s = 1 / sqrt(1 + r^2);
  50.             c = s*r;
  51.         else
  52.             r = -b / a;
  53.             c = 1 / sqrt(1 + r^2);
  54.             s = c*r;
  55.         end
  56.     end
  57. end
Advertisement
Add Comment
Please, Sign In to add comment