Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program lab_sm1;
- {$APPTYPE CONSOLE}
- uses
- SysUtils,
- Math;
- type matr=array [1..50,1..50] of real;
- type vect=array [1..50] of real;
- type Avect=array [1..1010] of vect;
- var
- a,c,b,a1,c1,b1: array [1..1010] of matr;
- zz:array [1..50,1..50] of matr;
- y,f,f1,y1,betta,betta1,zzz1,zzz2:Avect;
- i,j,i1,j1,k,n1,m1,n,m:integer;
- obr,matr2,matr3,matr0,obr_1,matr2_1,matr3_1,matr0_1,s1,s2,s3,p,p1,p2:matr;
- matr1,matr1_1,U,RR:vect;
- alfa,alfa1,S:array [1..1010] of matr;
- r: array [1..50] of real;
- {-------------------------------------------------------------------------------}
- function gauss(a:matr;b:vect;n,m:integer):vect;
- var i,j,k,l:integer;
- max,c,z,tmp:real;
- y3,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;
- y3[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]*y3[i];
- y3[k]:=z/a[k][k];
- end;
- // ~~~gauss~~~
- gauss:=y3;
- end;
- {-------------------------------------------------------------------------------}
- function obrat(a:matr;n,m:integer):matr;
- var
- u,l,tmp,obr:matr;
- c,sum:real;
- i,j,k,f3,t:integer;
- e:vect;
- x3,y3,b3:array [1..100] of vect;
- begin
- f3:=1;
- for i:= f3 to m do
- Begin
- for j:=f3 to m do
- begin
- L[i,j]:=0;
- U[i,j]:=0;
- end;
- end;
- for i:=f3 to m do
- Begin
- for j:=f3 to m do
- Begin
- U[f3,i]:=a[f3,i];
- L[i,f3]:=a[i,f3]/U[f3, f3];
- sum:=0;
- for k:=f3 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 := f3 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 j:=1 to m do b3[1][j]:=0;
- for k:=2 to m do b3[k]:=b3[1];
- for k:=1 to m do b3[k][k]:=1;
- for j:=1 to m do y3[j]:=gauss(l,b3[j],n,m);
- for j:=1 to m do x3[j]:=gauss(u,y3[j],n,m);
- for j:=1 to m do
- for i:=1 to m do obr[i][j]:=x3[j][i];
- obrat:=obr;
- end;
- {-------------------------------------------------------------------------------}
- // proizvedenie matrits
- function multi(a,b:matr;m:integer):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;
- {-------------------------------------------------------------------------------}
- function Trans(a:matr;n,m:integer):matr;
- Var i,j : integer;
- c : matr;
- Begin
- //c:=a;
- For i:=0 to n do
- For j:=0 to m do
- a[i,j]:=c[j,i];
- End;
- {-------------------------------------------------------------------------------}
- function MTRAN(X:matr;N,K:integer):matr;
- Var
- I,J:integer;
- XTR:matr;
- BEGIN
- for I := 1 to N do
- for j := 1 to K do
- XTR[J,I]:=X[I,J];
- END;
- {-------------------------------------------------------------------------------}
- // proizvedenie matritsy na stolbets
- function pulti(a:matr;b:vect;m:integer):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;m:integer):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;
- {-------------------------------------------------------------------------------}
- function minus(a,b:matr;m:integer):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;
- minus:=c;
- end;
- {-------------------------------------------------------------------------------}
- function mult(a,b:matr;n,m:integer):matr;
- var
- i,j,k : Integer;
- s,Res:matr;
- begin
- for i:=1 to n do begin
- for j:=1 to m*m do begin
- s[i,j]:=0;end;end;
- for i := 1 to n do
- for j := 1 to m*m do
- begin
- for k := 1 to m*m do
- s[i,j]:=s[i,j]+a[i,k]*b[k,j];
- Res[i,j]:=s[i,j];
- end;
- mult:=Res;
- end;
- {-------------------------------------------------------------------------------}
- function A23(n,m:integer):matr;
- var
- i,j,k,z,l:integer;
- a,b:matr;
- begin
- z:=1;
- l:=0;
- for i:=1 to m*m do begin
- for j:=1 to n do
- if (i=z+m*l )and (j=z+l) then begin
- a[i,j]:=-1; //z:=z+1;
- l:=l+1;
- end
- else a[i,j]:=0;
- end;
- {for j:=1 to n do begin
- for i:=1 to m*m do begin
- a[i,j]:=0;end;end;
- for j:=1 to m*m do
- for i:=1 to n do
- a[j,i]:=b[i,j]; }
- {for i:=1 to m*m do begin
- for j:=1 to n do begin
- write(a[i,j]:6:1,' ');end;writeln;end;}
- A23:=a;
- end;
- {-------------------------------------------------------------------------------}
- function A23T(n,m:integer):matr;
- var
- i,j,k,z,l:integer;
- a,b:matr;
- begin
- z:=1;
- l:=0;
- for j:=1 to m*m do begin
- for i:=1 to n do
- if (i=z+l )and (j=z+m*l) then begin
- a[i,j]:=-1; //z:=z+1;
- l:=l+1;
- end
- else a[i,j]:=0;
- end;
- {for i:=1 to n do begin
- for j:=1 to m*m do begin
- write(a[i,j]:6:1,' ');end;writeln;end; }
- A23T:=a;
- end;
- {-------------------------------------------------------------------------------}
- function A13T(n,m:integer):matr;
- var
- i,j,k,z:integer;
- a,b:matr;
- begin
- z:=1;
- for j:=1 to n do begin
- for i:=1 to m*m do
- if (i=z*n)and (j=z) then begin
- a[i,j]:=-1; z:=z+1;end
- else a[i,j]:=0;
- end;
- for j:=1 to n do
- for i:=1 to m*m do
- b[j,i]:=a[i,j];
- A13T:=b;
- {
- for i:=1 to n do begin
- for j:=1 to n*n do begin
- write(b[i,j]:6:1,' ');end;writeln;end; }
- end;
- {-------------------------------------------------------------------------------}
- function A13(n,m:integer):matr;
- var
- i,j,k,z:integer;
- a,b:matr;
- begin
- z:=1;
- for j:=1 to n do begin
- for i:=1 to m*m do begin
- a[i,j]:=0;
- if (i=z*m)and (j=z) then begin
- a[i,j]:=-1; z:=z+1;end;end;
- //else
- end;
- A13:=a;
- { for j:=1 to n do
- for i:=1 to n*n do
- b[j,i]:=a[i,j];}
- {
- for i:=1 to n*n do begin
- for j:=1 to m do begin
- write(a[i,j]:6:1,' ');end;writeln;end; }
- end;
- {-------------------------------------------------------------------------------}
- function Ann(m:integer):matr;
- var
- i,j,k:integer;
- q,c:matr;
- begin
- for i:=1 to m*m do begin
- for j:=1 to m*m do begin
- if i=j then q[i,j]:=4
- else if (i+m=j) or (i=j+m) or (i+1=j) or (i=j+1) then q[i,j]:=-1
- else q[i,j]:=0;
- end;
- end;
- for i:=1 to m*m do begin
- for j:=1 to m*m do begin
- for k:=1 to m-1 do begin
- if ((i=m*k+1) and (j=m*k)) or ((i=m*k) and (j=m*k+1)) then q[i,j]:=0;
- end;end;end;
- c:=obrat(q,m*m,m*m);
- { for i:=1 to m*m do begin
- for j:=1 to m*m do begin
- write(q[i,j]:4:1,' ');
- end; writeln; end;}
- Ann:=c;
- end;
- {-------------------------------------------------------------------------------}
- function A33(a,b:integer):matr;
- var
- i,j:integer;
- q:matr;
- begin
- for i:=1 to a do begin
- for j:=1 to b do begin
- if i=j then q[i,j]:=4
- else if (i+1=j) or (i=j+1) then q[i,j]:=-1
- else q[i,j]:=0;
- end;end;
- { for i:=1 to a do begin
- for j:=1 to b do begin
- write(q[i,j]:6:1,' ');
- end; writeln; end; }
- A33:=q;
- end;
- {-------------------------------------------------------------------------------}
- //slozhenie stolbtsov
- function plus1(a,b:vect;m:integer):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:integer;f,f1:Avect);
- //procedure matrprog(n,m,n1,m1: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]:=16;
- 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]:=16;
- 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],n,m),b[1],m);
- 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],n,m),f[1],m);
- for k:=2 to n do begin
- matr2:=multi(a[k],alfa[k-1],m);
- matr3:=plus(c[k],matr2,m);
- obr:=obrat(matr3,n,m);
- 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],m);
- 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],m);
- for i:=1 to m do matr1[i]:=(-1)*matr1[i];
- betta[k]:=pulti(obr,plus1(f[k],matr1,m),m);
- end;
- //-------------------2 oblast' -----------------------
- alfa1[1]:=multi(obrat(c1[1],n1,m1),b1[1],m1);
- 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],n1,m1),f1[1],m1);
- for k1:=2 to n1 do begin
- matr2_1:=multi(a1[k1],alfa1[k1-1],m1);
- matr3_1:=plus(c1[k1],matr2_1,m1);
- obr_1:=obrat(matr3_1,n1,m1);
- 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],m1);
- 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],m1);
- for i1:=1 to m1 do matr1_1[i1]:=(-1)*matr1_1[i1];
- betta1[k1]:=pulti(obr_1,plus1(f1[k1],matr1_1,m1),m1);
- end;
- y[n]:=betta[n];
- for i:=n-1 downto 1 do begin
- y[i]:=pulti(alfa[i],y[i+1],m);
- y[i]:=plus1(y[i],betta[i],m);
- end;
- y1[n1]:=betta1[n1];
- for i1:=n1-1 downto 1 do begin
- y1[i1]:=pulti(alfa1[i1],y1[i1+1],m1);
- y1[i1]:=plus1(y1[i1],betta1[i1],m1);
- end;
- writeln('-------------Reshenie 1 oblasti------------'); writeln;
- for i:=1 to n do begin
- for j:=1 to m do write(y[i][j]:6:6,' ');
- writeln;
- end; writeln;
- writeln('-------------Reshenie 2 oblasti------------');
- writeln;
- for i1:=1 to n1 do begin
- for j1:=1 to m1 do write(y1[i1][j1]:6:6,' ');
- writeln;
- end;
- writeln('-------------nev9zka na linii scepleni9------------');
- for i:=1 to n1 do begin
- RR[i]:=y1[i][1]+y[n-n1+i][m]+16;
- writeln(RR[i]:6:6,' ');
- end; writeln;
- end;
- begin
- assign(output,'output.txt');
- rewrite(output);
- n:=7;m:=7;
- n1:=3;m1:=3;
- for i:=1 to n do
- for j:=1 to m do
- zzz1[i][j]:=16;
- for i1:=1 to n1 do
- for j1:=1 to m1 do
- zzz2[i1][j1]:=16;
- matrprog(n,m,n1,m1,zzz1,zzz2);
- //matrprog(n,m,n1,m1);
- writeln('-------------rezyltat A13T*A11^(-1)*A13------------');
- s1:=mult(mult(A13T(n1,m1),Ann(m1),n1,m1),A13(n1,m1),n1,m1);
- for i:=1 to n1 do begin
- for j:=1 to m1 do begin
- write(s1[i,j]:6:6,' ');end;writeln;end;;writeln;
- writeln('-------------rezyltat A23T*A22^(-1)*A23------------');
- s2:=mult(mult(A23T(n1,m),Ann(m),n1,m),A23(n1,m),n1,m);
- for i:=1 to n1 do begin
- for j:=1 to m1 do begin
- write(s2[i,j]:6:6,' ');end;writeln;end; writeln;
- writeln('-------------rezyltat S=A33-A13T*A11^(-1)*A13-A23T*A22^(-1)*A23------------');
- s3:=minus(A33(n1,m1),plus(s1,s2,m1),m1);
- for i:=1 to n1 do begin
- for j:=1 to m1 do begin
- write(s3[i,j]:6:6,' ');end;writeln;end; writeln;
- writeln('-------------U reshenie na linii scepleni9------------');
- U:=gauss(s3,RR,n1,m1);
- for i:=1 to n1 do begin
- write(U[i]:6:6,' ');writeln;end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement