Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program lab_sm1;
- {$APPTYPE CONSOLE}
- uses
- SysUtils,Math;
- // íàõîæäåíèå îáðàòíîå ìàòðèöû
- const n=7;
- const m=7;
- type matr=array [1..50,1..50] of real;
- type vect=array [1..50] of real;
- var
- a,c,b,a1,c1,b1: array [1..1010] of matr;
- y,f,y1,f1:array [1..1010] of vect;
- i,j,k:integer;
- obr,matr2,matr3,matr0,obr_1,matr2_1,matr3_1,matr0_1:matr;
- matr1,matr1_1:vect;
- alfa,alfa1:array [1..1010] of matr;
- betta,betta1:array [1..1010] of vect;
- //------------------------------------------------------------------------
- function gauss(a:matr;b:vect):vect;
- var i,j,k,l:integer;
- max,c,z,tmp:real;
- y,e:vect;
- begin
- // ~~~gauss~~~
- for k:=1 to m-1 do begin
- max:=abs(a[k][k]);
- l:=k;
- for j:=k+1 to m do begin
- if abs(a[j][k])>max then begin
- l:=j;
- max:=abs(a[j][k]);
- end;
- end;
- if l<>k then begin
- for j:=k to m do begin
- tmp:=a[l,j];
- a[l,j]:=a[k,j];
- a[k,j]:=tmp;
- end;
- tmp:=b[k];
- b[k]:=b[l];
- b[l]:=tmp;
- end;
- for i:=k+1 to m do begin
- c:=a[i,k]/a[k,k];
- b[i]:=b[i]-b[k]*c;
- for j:=k to m do a[i][j]:=a[i][j]-a[k][j]*c;
- end;
- end;
- y[m]:=b[m]/a[m,m];
- for k:=m-1 downto 1 do begin
- z:=b[k];
- for i:=k+1 to m do z:=z-a[k][i]*y[i];
- y[k]:=z/a[k][k];
- end;
- // ~~~gauss~~~
- gauss:=y;
- end;
- //------------------------------------------------------------------------
- function obrat(a:matr):matr;
- var
- u,l,tmp,obr:matr;
- c,sum:real;
- i,j,k,f,t:integer;
- e:vect;
- x1,y1,b1:array [1..50] of vect;
- begin
- // ðàçëîæåíèå LU
- f:=1;
- for i := f to m do
- Begin
- for j:=f to m do
- begin
- L[i,j]:=0;
- U[i,j]:=0;
- end;
- end;
- for i:=f to m do
- Begin
- for j:=f to m do
- Begin
- U[f,i]:=a[f,i];
- L[i,f]:=a[i,f]/U[f, f];
- sum:=0;
- for k:=f to i do sum:=sum+L[i, k]*U[k, j];
- U[i,j]:=a[i, j]-sum;
- if i>j then L[j,i]:=0 else
- Begin
- sum := 0;
- for k := f to i do sum := sum + L[j, k] * U[k, i];
- if U[i, i] <> 0 then L[j, i] :=(a[j, i] - sum)/U[i, i];
- end;
- end;
- end;
- { for i:=1 to m do begin
- for j:=1 to m do write(l[i,j]:3:3,' ');
- writeln;
- end;
- for i:=1 to m do begin
- for j:=1 to m do write(u[i,j]:3:3,' ');
- writeln;
- end; }
- for j:=1 to m do b1[1][j]:=0;
- for k:=2 to m do b1[k]:=b1[1];
- for k:=1 to m do b1[k][k]:=1;
- for j:=1 to m do y1[j]:=gauss(l,b1[j]);
- for j:=1 to m do x1[j]:=gauss(u,y1[j]);
- for j:=1 to m do
- for i:=1 to m do obr[i][j]:=x1[j][i];
- obrat:=obr;
- {for i:=1 to m do begin
- for j:=1 to m do write(obr[i,j]:3:3,' ');
- writeln;
- end;}
- end;
- //------------------------------------------------------------------------
- // proizvedenie matrits
- function multi(a,b:matr):matr;
- var i,j,k:integer;
- tmp:real;
- c:matr;
- begin
- for i:=1 to m do
- for j:=1 to m do begin
- tmp:=0;
- for k:=1 to m do begin
- tmp:=tmp+a[i][k]*b[k][j];
- end;
- c[i][j]:=tmp;
- end;
- multi:=c;
- end;
- //------------------------------------------------------------------------
- // proizvedenie matritsy na stolbets
- function pulti(a:matr;b:vect):vect;
- var i,j,k:integer;
- tmp:real;
- c:vect;
- begin
- for i:=1 to m do begin
- tmp:=0;
- for k:=1 to m do begin
- tmp:=tmp+a[i][k]*b[k];
- end;
- c[i]:=tmp;
- end;
- pulti:=c;
- end;
- //------------------------------------------------------------------------
- // slogenie matrits
- function plus(a,b:matr):matr;
- var i,j,k:integer;
- tmp:real;
- c:matr;
- begin
- for i:=1 to m do
- for j:=1 to m do begin
- c[i][j]:=a[i][j]+b[i][j];
- end;
- plus:=c;
- end;
- //------------------------------------------------------------------------
- //slozhenie stolbtsov
- function plus1(a,b:vect):vect;
- var
- i:integer;
- c:vect;
- begin
- for i:=1 to m do c[i]:=a[i]+b[i];
- plus1:=c;
- end;
- //---------------------------------------------------------------------------------------------------
- procedure matrprog(n,m,n1,m1,pr:integer);
- var i,j,k,i1,j1,k1:integer;
- begin
- for i:=1 to n do
- for j:=1 to m do f[i][j]:=pr;
- for k:=1 to n do
- for i:=1 to m do begin
- for j:=1 to m do begin
- if i=j then begin
- a[k][i,i]:=-1;
- b[k][i,i]:=-1;
- end;
- end;
- end;
- for i1:=1 to n1 do
- for j1:=1 to m1 do f1[i1][j1]:=pr;
- for k1:=1 to n1 do
- for i1:=1 to m1 do begin
- for j1:=1 to m1 do begin
- if i1=j1 then begin
- a1[k1][i1,i1]:=-1;
- b1[k1][i1,i1]:=-1;
- end;
- end;
- end;
- for k:=1 to n do
- for i:=1 to m do
- for j:=1 to m do begin
- if i=j then c[k][i,j]:=4;
- if (i-j=1) or (i-j=-1) then c[k][i,j]:=-1
- end;
- for k1:=1 to n1 do
- for i1:=1 to m1 do
- for j1:=1 to m1 do begin
- if i1=j1 then c1[k1][i1,j1]:=4;
- if (i1-j1=1) or (i1-j1=-1) then c1[k1][i1,j1]:=-1
- end;
- //------------------------- 1 oblast
- alfa[1]:=multi(obrat(c[1]),b[1]);
- for i:=1 to m do
- for j:=1 to m do alfa[1][i][j]:=(-1)*alfa[1][i][j];
- betta[1]:=pulti(obrat(c[1]),f[1]);
- for k:=2 to n do begin
- matr2:=multi(a[k],alfa[k-1]);
- matr3:=plus(c[k],matr2);
- obr:=obrat(matr3);
- for i:=1 to m do
- for j:=1 to m do obr[i][j]:=(-1)*obr[i][j];
- alfa[k]:=multi(obr,b[k]);
- for i:=1 to m do
- for j:=1 to m do obr[i][j]:=(-1)*obr[i][j];
- matr1:=pulti(a[k],betta[k-1]);
- for i:=1 to m do matr1[i]:=(-1)*matr1[i];
- betta[k]:=pulti(obr,plus1(f[k],matr1));
- end;
- writeln('yo');
- //--------------------------------2 oblast'
- alfa1[1]:=multi(obrat(c1[1]),b1[1]);
- for i1:=1 to m1 do
- for j1:=1 to m1 do alfa1[1][i1][j1]:=(-1)*alfa1[1][i1][j1];
- betta1[1]:=pulti(obrat(c1[1]),f1[1]);
- for k1:=2 to n1 do begin
- matr2_1:=multi(a1[k1],alfa1[k1-1]);
- matr3_1:=plus(c1[k1],matr2_1);
- obr_1:=obrat(matr3_1);
- for i1:=1 to m1 do
- for j1:=1 to m1 do obr_1[i1][j1]:=(-1)*obr_1[i1][j1];
- alfa1[k1]:=multi(obr_1,b1[k1]);
- for i1:=1 to m1 do
- for j1:=1 to m1 do obr_1[i1][j1]:=(-1)*obr_1[i1][j1];
- matr1_1:=pulti(a1[k1],betta1[k1-1]);
- for i1:=1 to m1 do matr1_1[i1]:=(-1)*matr1_1[i1];
- betta1[k1]:=pulti(obr_1,plus1(f1[k1],matr1_1));
- end;
- writeln('yo2');
- y[n]:=betta[n];
- for i:=n-1 downto 1 do begin
- y[i]:=pulti(alfa[i],y[i+1]);
- y[i]:=plus1(y[i],betta[i]);
- end;
- y1[n1]:=betta1[n1];
- for i1:=n1-1 downto 1 do begin
- y1[i1]:=pulti(alfa1[i1],y1[i1+1]);
- y1[i1]:=plus1(y1[i1],betta1[i1]);
- end;
- for i:=1 to n do begin
- for j:=1 to m do write(y[i][j]:3:3,' ');
- writeln;
- end;
- writeln('proba');
- for i1:=1 to n1 do begin
- for j1:=1 to m1 do write(y1[i1][j1]:3:3,' ');
- writeln;
- end;
- end;
- begin
- assign (input,'input.txt');
- reset(input);
- assign(output,'output.txt');
- rewrite(output);
- matrprog(7,7,3,3,16);
- {for i:=1 to n do
- for j:=1 to n do read(a[1][i][j]);
- a[2]:=a[1];
- a[3]:=a[1];
- b[1]:=a[1];
- b[2]:=a[1];
- b[3]:=a[1];
- for i:=1 to n do
- for j:=1 to n do read(c[1][i][j]);
- c[2]:=c[1];
- c[3]:=c[1];
- }
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement