Advertisement
Jade39

xren'

May 7th, 2014
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.34 KB | None | 0 0
  1. program lab_sm1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils,Math;
  7. // íàõîæäåíèå îáðàòíîå ìàòðèöû
  8. type matr=array [1..50,1..50] of real;
  9. type vect=array [1..50] of real;
  10.  
  11. var
  12. a,c,b: array [1..1010] of matr;
  13. y,f:array [1..1010] of vect;
  14. i,j,k,n,m:integer;
  15. obr,matr2,matr3,matr0:matr;
  16. matr1:vect;
  17. alfa:array [1..1010] of matr;
  18. betta:array [1..1010] of vect;
  19.  
  20. function gauss(a:matr;b:vect):vect;
  21. var i,j,k,l:integer;
  22. max,c,z,tmp:real;
  23. y,e:vect;
  24. begin
  25.  
  26.    // ~~~gauss~~~
  27.    for k:=1 to m-1 do begin
  28.        max:=abs(a[k][k]);
  29.        l:=k;
  30.        for j:=k+1 to m do begin
  31.            if abs(a[j][k])>max then begin
  32.               l:=j;
  33.               max:=abs(a[j][k]);
  34.            end;
  35.        end;
  36.        if l<>k then begin
  37.           for j:=k to m do begin
  38.              tmp:=a[l,j];
  39.              a[l,j]:=a[k,j];
  40.              a[k,j]:=tmp;
  41.           end;
  42.           tmp:=b[k];
  43.           b[k]:=b[l];
  44.           b[l]:=tmp;
  45.        end;
  46.  
  47.        for i:=k+1 to m do begin
  48.          c:=a[i,k]/a[k,k];
  49.          b[i]:=b[i]-b[k]*c;
  50.          for j:=k to m do a[i][j]:=a[i][j]-a[k][j]*c;
  51.        end;
  52.    end;
  53.  
  54.    y[m]:=b[m]/a[m,m];
  55.  
  56.    for k:=m-1 downto 1 do begin
  57.        z:=b[k];
  58.        for i:=k+1 to m do z:=z-a[k][i]*y[i];
  59.        y[k]:=z/a[k][k];
  60.    end;
  61.  
  62.    // ~~~gauss~~~
  63.  
  64.  
  65.       gauss:=y;
  66. end;
  67. function obrat(a:matr):matr;
  68. var
  69. u,l,tmp,obr:matr;
  70. c,sum:real;
  71. i,j,k,f,t:integer;
  72. e:vect;
  73. x1,y1,b1:array [1..50] of vect;
  74. begin
  75.  
  76. // ðàçëîæåíèå LU
  77.  
  78.  f:=1;
  79.    for i := f to m do
  80.                Begin
  81.                   for j:=f to m do
  82.                   begin
  83.                      L[i,j]:=0;
  84.                      U[i,j]:=0;
  85.                   end;
  86.                end;
  87.                for i:=f to m do
  88.                Begin
  89.                   for j:=f to m do
  90.                   Begin
  91.                      U[f,i]:=a[f,i];
  92.                      L[i,f]:=a[i,f]/U[f, f];
  93.                      sum:=0;
  94.                      for k:=f to i do sum:=sum+L[i, k]*U[k, j];
  95.                      U[i,j]:=a[i, j]-sum;
  96.                      if i>j then L[j,i]:=0 else
  97.                      Begin
  98.                         sum := 0;
  99.                         for k := f to i do sum := sum + L[j, k] * U[k, i];
  100.                         if U[i, i] <> 0 then L[j, i] :=(a[j, i] - sum)/U[i, i];
  101.                      end;
  102.                   end;
  103.                end;
  104.  
  105.        { for i:=1 to m do begin
  106.            for j:=1 to m do write(l[i,j]:3:3,' ');
  107.            writeln;
  108.         end;
  109.         for i:=1 to m do begin
  110.            for j:=1 to m do write(u[i,j]:3:3,' ');
  111.            writeln;
  112.         end;  }
  113.    for j:=1 to m do b1[1][j]:=0;
  114.    for k:=2 to m do b1[k]:=b1[1];
  115.    for k:=1 to m do b1[k][k]:=1;
  116.  
  117.    for j:=1 to m do y1[j]:=gauss(l,b1[j]);
  118.    for j:=1 to m do x1[j]:=gauss(u,y1[j]);
  119.  
  120.   for j:=1 to m do
  121.   for i:=1 to m do  obr[i][j]:=x1[j][i];
  122.  
  123.    obrat:=obr;
  124.  {for i:=1 to m do begin
  125.   for j:=1 to m do write(obr[i,j]:3:3,' ');
  126.   writeln;
  127.   end;}
  128. end;
  129. // proizvedenie matrits
  130. function multi(a,b:matr):matr;
  131. var i,j,k:integer;
  132. tmp:real;
  133. c:matr;
  134. begin
  135. for i:=1 to m do
  136.   for j:=1 to m do begin
  137.      tmp:=0;
  138.      for k:=1 to m do begin
  139.          tmp:=tmp+a[i][k]*b[k][j];
  140.      end;
  141.      c[i][j]:=tmp;
  142.    end;
  143.    multi:=c;
  144. end;
  145. // proizvedenie matritsy na stolbets
  146. function pulti(a:matr;b:vect):vect;
  147. var i,j,k:integer;
  148. tmp:real;
  149. c:vect;
  150. begin
  151.   for i:=1 to m do begin
  152.      tmp:=0;
  153.      for k:=1 to m do begin
  154.          tmp:=tmp+a[i][k]*b[k];
  155.      end;
  156.      c[i]:=tmp;
  157.    end;
  158.    pulti:=c;
  159. end;
  160. // slogenie matrits
  161. function plus(a,b:matr):matr;
  162. var i,j,k:integer;
  163. tmp:real;
  164. c:matr;
  165. begin
  166. for i:=1 to m do
  167.   for j:=1 to m do begin
  168.      c[i][j]:=a[i][j]+b[i][j];
  169.   end;
  170.   plus:=c;
  171. end;
  172. //slozhenie stolbtsov
  173. function plus1(a,b:vect):vect;
  174. var
  175. i:integer;
  176. c:vect;
  177. begin
  178.   for i:=1 to m do  c[i]:=a[i]+b[i];
  179.   plus1:=c;
  180. end;
  181.  
  182. procedure Matrprog(n,m:integer);
  183. var i,j,k:integer;
  184. begin
  185. for i:=1 to n do
  186. for j:=1 to m do f[i][j]:=16;
  187. for k:=1 to n do
  188. for i:=1 to m do  begin
  189.    for j:=1 to m do begin
  190.        if i=j then begin
  191.           a[k][i,i]:=-1;
  192.           b[k][i,i]:=-1;
  193.        end;
  194.    end;
  195. end;
  196.  
  197. for k:=1 to n do
  198. for i:=1 to m do
  199.    for j:=1 to m do begin
  200.        if i=j then c[k][i,j]:=4;
  201.        if (i-j=1) or (i-j=-1) then c[k][i,j]:=-1
  202.    end;
  203.  { matr0:=obrat(c[1]);
  204.   matr0:=multi(matr0,c[1]);
  205.  
  206.   for i:=1 to m do begin
  207.   for j:=1 to m do write(matr0[i,j]:3:3,' ');
  208.   writeln;
  209.   end;
  210.   writeln;  }
  211. alfa[1]:=multi(obrat(c[1]),b[1]);
  212. for i:=1 to m do
  213. for j:=1 to m do alfa[1][i][j]:=(-1)*alfa[1][i][j];
  214. betta[1]:=pulti(obrat(c[1]),f[1]);
  215.  
  216. for k:=2 to n do begin
  217.     matr2:=multi(a[k],alfa[k-1]);
  218.     matr3:=plus(c[k],matr2);
  219.     obr:=obrat(matr3);
  220.     for i:=1 to m do
  221.       for j:=1 to m do obr[i][j]:=(-1)*obr[i][j];
  222.     alfa[k]:=multi(obr,b[k]);
  223.     for i:=1 to m do
  224.       for j:=1 to m do obr[i][j]:=(-1)*obr[i][j];
  225.     matr1:=pulti(a[k],betta[k-1]);
  226.     for i:=1 to m do matr1[i]:=(-1)*matr1[i];
  227.     betta[k]:=pulti(obr,plus1(f[k],matr1));
  228. end;
  229.  writeln('ewrheth');
  230.  
  231. y[n]:=betta[n];
  232. for i:=n-1 downto 1 do begin
  233.    y[i]:=pulti(alfa[i],y[i+1]);
  234.    y[i]:=plus1(y[i],betta[i]);
  235. end;
  236.   for i:=1 to n do  begin
  237.     for j:=1 to m do write(y[i][j]:3:3,' ');
  238.     writeln;
  239.   end;
  240. end;
  241.  
  242. begin
  243. assign(output,'output.txt');
  244. rewrite(output);
  245.  n:=7;m:=7;
  246. Matrprog(n,m);
  247.  
  248. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement