Guest User

QReigenvalues

a guest
Aug 12th, 2021
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.73 KB | None | 0 0
  1. program qreigenvalues;
  2. uses crt;
  3. const maxiter = 1000;
  4. type matrix = array of array of Double;
  5.      vector = array of Double;
  6.  
  7. procedure QRdecomp(var A,Q:matrix;n:integer);
  8. var v:vector;
  9.     sum,A0,sqrsum,temp:double;
  10.     sign:integer;
  11.     i,j,k:integer;
  12. begin
  13.   for i := 0 to n - 1 do
  14.      for j := 0 to n - 1 do
  15.          Q[i,j] := 0;
  16.   for i := 0 to n - 1 do
  17.       Q[i,i] := 1;
  18.   SetLength(v,n);
  19.   for k := 0 to n - 1 do
  20.   begin
  21.     sum := 0;
  22.     A0 := A[k,k];
  23.     if A0 < 0 then
  24.        sign := -1
  25.     else
  26.        sign := 1;
  27.     for i := k to n - 1 do
  28.        sum := sum + sqr(A[i,k]);
  29.     sqrSum := sign*sqrt(sum);
  30.     temp := sqrt(2*(sum + A0 * sqrSum));
  31.     v[k] := (sqrSum + A0)/temp;
  32.     for i := k + 1 to n - 1 do
  33.        v[i] := A[i,k]/temp;
  34.     for j := 0 to n - 1 do
  35.     begin
  36.       sum := 0;
  37.       for i := k to n - 1 do
  38.          sum := sum + v[i]*A[i,j];
  39.       for i := k to n - 1 do
  40.          A[i,j] := A[i,j] - 2*v[i]*sum;
  41.     end;
  42.     for j := 0 to n - 1 do
  43.     begin
  44.       sum := 0;
  45.       for i := k to n - 1 do
  46.          sum := sum + v[i]*Q[i,j];
  47.       for i := k to n - 1 do
  48.          Q[i,j] := Q[i,j] - 2*v[i]*sum;
  49.     end;
  50.   end;
  51.   for i := 0 to n - 1 do
  52.   for j := i + 1 to n - 1 do
  53.   begin
  54.     temp := Q[i,j];
  55.     Q[i,j] := Q[j,i];
  56.     Q[j,i] := temp;
  57.   end;
  58. end;
  59.  
  60. procedure multiplyMatrix(A,B:matrix;var C:matrix;n:integer);
  61. var i,j,k:integer;
  62.     sum : double;
  63. begin
  64.   for i := 0 to n - 1 do
  65.       for j := 0 to n - 1 do
  66.       begin
  67.         sum := 0;
  68.         for k := 0 to n - 1 do
  69.           sum := sum + A[i,k]*B[k,j];
  70.           C[i,j] := sum;
  71.       end;
  72. end;
  73.  
  74. procedure copyMatrix(A:matrix;var B:matrix;n:integer);
  75. var i,j:integer;
  76. begin
  77.   for i := 0 to n - 1 do
  78.      for j := 0 to n - 1 do
  79.         B[i,j] := A[i,j];
  80. end;
  81.  
  82. procedure printMatrix(var f:text;A:matrix;n:integer);
  83. var i,j:integer;
  84. begin
  85.   for i := 0 to n - 1 do
  86.     begin
  87.       for j := 0 to n - 1 do
  88.         write(f,A[i,j]:1:12,' ');
  89.       writeln(f);
  90.     end;
  91.     writeln(f);
  92. end;
  93.  
  94. var A,Q,R:matrix;
  95.     i,j,n:integer;
  96.     esc:char;
  97.     f:text;
  98.  
  99. begin
  100.   clrscr;
  101.   assign(f,'eig.txt');
  102.   {$I-}
  103.   reset(f);
  104.   {$I+}
  105.   if IOResult = 0 then
  106.     append(f)
  107.   else
  108.     Rewrite(f);
  109.   repeat
  110.     writeln('Podaj rozmiar macierzy');
  111.     readln(n);
  112.     SetLength(A,n,n);
  113.     SetLength(Q,n,n);
  114.     SetLength(R,n,n);
  115.     for i := 0 to n- 1 do
  116.        for j := 0 to n-1 do
  117.        begin
  118.          write('A[',i+1,',',j+1,']=');
  119.          readln(A[i,j]);
  120.        end;
  121.     printmatrix(f,A,n);
  122.     for i := 1 to maxiter do
  123.     begin
  124.       QRdecomp(A,Q,n);
  125.       copyMatrix(A,R,n);
  126.       multiplyMatrix(R,Q,A,n);
  127.     end;
  128.     printmatrix(f,A,n);
  129.     esc := readkey;
  130.   until esc = #27;
  131.   close(f);
  132. end.
  133.  
Advertisement
Add Comment
Please, Sign In to add comment