Advertisement
Jade39

yo2

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