Смекни!
smekni.com

Структуровані типи даних Операції над двомірними масивами (стр. 2 из 3)

a=1 b=1 b=1 a=1

Кожна із вказаних сум дорівнює сумі всіх елементів деякої матриці (tab ), обчисленій двома різними способами. Отже, hij = gij, що й потрібно довести.

Інші властивості добутку доводяться аналогіччно, тільки простіше.

Оберненою називається матриця А-1, така що якщо її помножити на матрицю до якої вона обернена, то в результаті отримаємо одиничну матрицю. А*А-1

Знайти матрицю, обернену до квадратної матриці М= аi k ,можна за допомогою операцій над розширеною матрицею А:

m11 . . . . m1n 1 . . . . 0

A= . . . . . . . . . . . . . . . .

mn1 . . . . mnn 0 . . . . 1

Якщо ліву частину матриці А звести елементарними перетвореннями до одиничної, то в правій частині дістанемо матрицю, обернену до М.

До елементарних перетворень належать:

1)Переставлення двох рядків матриці А (або двох однойменних стовпців в лівій і правій частинах матриці А);

2)Множення рядка на відмінне від нуля число( або однойменних стовпців в лівій і правій частинах матриці А);

3)Заміна рядка сумою цього і будь-якого іншого рядка (або та ж сама сума однойменних стовпців в лівій і правій частинах матриці А);

Ділення двох матриць.

Дію ділення можна замінити дією множення на обернену матрицю

A B = A * В-1

PROGRAM povorot; {Поворот матриці }

USES CRT;

CONST

N=3;

TYPE

S=ARRAY[1..N,1..N]OF REAL;

SS=ARRAY[1..N,1..N]OF REAL;

VAR

S1:S;S2:SS;M,i,j:INTEGER;

BEGIN

FOR i:=1 TO N DO

BEGIN

FOR j:=1 TO N DO

BEGIN

READ(S1[i,j]); {Ввід матриці}

END;

END;

WRITE('Vvedit kut povorotu');

READ(M); {Ввід кута повороту}

CASE M OF

90:BEGIN {Поворот матриці на 90°}

FOR i:=1 TO N DO

FOR j:=1 TO N DO

S2[I,J]:=S1[N-J+1,I];

FOR i:=1 TO N DO

FOR j:=1 TO N DO

WRITELN(S2[i,j]);

END;

180: BEGIN {Поворот матриці на 180°}

FOR I:=1 TO N DO

FOR J:=1 TO N DO

S2[I,J]:=S1[N-I+1,N-J+1];

FOR I:=1 TO N DO

FOR J:=1 TO N DO

WRITELN(S2[I,J]);

END;

270: BEGIN {Поворот матриці на 270°}

FOR I:=1 TO N DO

FOR J:=1 TO N DO

S2[I,J]:=S1[J,N-I+1];

FOR I:=1 TO N DO

FOR J:=1 TO N DO

WRITELN(S2[I,J]); {Вивід результату}

END; END;

END.

Program Suma; {Сума двох матриць}

Const dim1=20;

dim2=40;{dim2=2*dim1}

Type ar1=array[1..dim1,1..dim2] of real;

ar2=array[1..dim1,1..dim2] of real;

ar3=array[1..dim1,1..dim2] of real;

Var i,j,n,m:integer;

A:ar1;

B:ar2;

C:ar3;

Begin

write('Введіть розмірність матриці М');

readln(n,m); {Ввід розмірності матриць }

write('Введіть матрицю М');

For i:=1 to n do

For j:=1 to m do

read(A[i,j]); {Ввід першої матриці}

write('Введіть матрицю М');

For i:=1 to n do

For j:=1 to m do

read(B[i,j]); {Ввід другої матриці}

For i:=1 to n do

For j:=1 to m do

C[i,j]:=A[i,j]+B[i,j]; {Обчислення суми матриць}

For i:=1 to n do

For j:=1 to m do

writeln(C[i,j]); {Вивід результату}

End.

Результати:

n=2,m=3

1 -4 5 6 -1 0 7 -5 5

0 3 8 6 0 -9 6 3 -1

Program Rizn; {Знаходження різниці двох матриць}

Const dim1=20;

dim2=40;

Type ar1=array[1..dim1,1..dim2] of real;

ar2=array[1..dim1,1..dim2] of real;

ar3=array[1..dim1,1..dim2] of real;

Var i,j,n,m:integer;

A:ar1;

B:ar2;

C:ar3;

Begin

write('Введіть розмірність матриці М');

readln(n,m); {Ввід розмірності матриць}

write('Введіть матрицю М');

For i:=1 to n do

For j:=1 to m do

read(A[i,j]); {Ввід першої матриці}

write('Введіть матрицю М');

For i:=1 to n do

For j:=1 to m do

read(B[i,j]); {Ввід другої матриці}

For i:=1 to n do

For j:=1 to m do

C[i,j]:=A[i,j]-B[i,j]; {Знаходження їх різниці}

For i:=1 to n do

For j:=1 to m do

writeln(C[i,j]); {Вивід результату}

End.

Результати:

n=2,m=3

1 -4 5 6 -1 0 -5 -3 5

0 3 8 6 0 -9 -6 3 17

if k<>i then

For j:=n1 downto 1 do

a[k,j]:=a[k,j]-a[i,j]*a[k,i];end;

For i:=1 to n do

For j:=1 to n do

m[i,j]:=a[i,j+n];

For i:=1 to n do

For j:=1 to n do

writeln(m[i,j]:6:2); {Вивід оберненої матриці}

End.

2 4 3 -0,2 0 0,2

М= 0 -1 -5 М-1 = 0,41 0,18 -0,112

7 4 3 -0,08 -0,24 0,02

Program Dobutok; {Множення числа на матрицю}

Const dim1=20;

dim2=40;{dim2=2*dim1}

Type ar1=array[1..dim1,1..dim2] of real;

ar2=array[1..dim1,1..dim2] of real;

Var i,j,n,m:integer;

A:ar1; C:ar2;

r:real;

Begin

write('Введіть число');

readln(r); {Ввід числа}

write('Введіть розмірність матриці М');

readln(n,m); {Ввід розмірності матриці}

write('Введіть матрицю М');

For i:=1 to n do

For j:=1 to m do

read(A[i,j]); {Ввід матриці}

For i:=1 to n do

For j:=1 to m do

C[i,j]:=A[i,j]*r; {Множення матриці на число}

For i:=1 to n do

For j:=1 to m do

writeln(C[i,j]); {Вивід результату}

End.

Резуьтати:

r=5 n=3,m=2

-1 2 -5 10

M= 3 5 C= 15 25

4 -2.5 20 -12.5

Program obernena; {Знаходження оберненої матриці}

Const dim1=20;

dim2=40;{dim2=2*dim1}

Type ar=array[1..dim1,1..dim1] of real;

ar1=array[1..dim1,1..dim2] of real;

Var i,j,k,n1:integer; n:integer;Var m:ar;e:real;

t,s:real;

a:ar1;

Begin

readln(e); {Ввід точності обчислень}

write('Введіть розмірність матриці М');

readln(n); {Ввфд розмірності квадратної матриці}

write('Введіть матрицю М');

For i:=1 to n do

For j:=1 to n do

read(m[i,j]); {Ввід матриці}

n1:=2*n;

For i:=1 to n do

For j:=1 to n1 do

if j<=n then a[i,j]:=m[i,j]

else if j=n+i then a[i,j]:=1

else a[i,j]:=0;

For i:=1 to n do

begin k:=i;s:=a[i,i];

for j:=i+1 to n do

begin t:=a[j,i];

if abs(s)<abs(t) then begin s:=t;k:=j;end;end;

if abs(s)<e then begin {Знаходження визначника}

write('M-вироджена');Halt end;

For j:=i to n1 do

begin t:=a[k,j];a[k,j]:=a[i,j];a[i,j]:=t/s;end; {Знаходження елементів оберненої }

For k:=1 to n do {матриці}

рrgram dob_mas;

Const dim1=30;

dim2=40;

dim3=30;

Type ar1=array[1..dim2,1..dim1] of real;

ar2=array[1..dim3,1..dim2] of real;

ar3=array[1..dim1,1..dim3] of real;

Var i,j,k,l,n,m:integer;

A:ar1;

B:ar2;

C:ar3;

Begin

write('Введіть розмірність матриці М');

readln(n,m,l);

write('Введіть матрицю А');

For i:=1 to n do

For j:=1 to m do

read(A[i,j]);

write('Введіть матрицю В');

For i:=1 to l do

For j:=1 to n do

read(B[i,j]);

For i:=1 to m do

For j:=1 to l do

For k:=1 to n do

C[i,j]:=C[i,j]+A[k,i]*B[j,k];

For i:=1 to m do

For j:=1 to l do

writeln(C[i,j]);

End.

Результати:

n=2,m=2,l=2,

1 2 3 4

3 4 1 2

рrogram dilennya; {Ділення двох матриць}

Const dim1=20;

dim2=40;{dim2=2*dim1}

Type ar1=array[1..dim1,1..dim1] of real;

ar2=array[1..dim1,1..dim1] of real;

ar3=array[1..dim1,1..dim2] of real;

ar4=array[1..dim1,1..dim2] of real;

Var i,j,k,n1:integer; n:integer; M:ar3;e:real;

t,s:real;

A:ar1;B:ar2;c:ar4;

Begin

readln(e); {Знаходження оберненої матриці }

write('Введіть розмірність матриці М');

readln(n);

write('Введіть матрицю M');

For i:=1 to n do

For j:=1 to n do

read(M[i,j]);

write('Введіть матрицю B');

For i:=1 to n do

For j:=1 to n do

read(B[i,j]);

n1:=2*n;

For i:=1 to n do

For j:=1 to n1 do

if j<=n then a[i,j]:=m[i,j]

else if j=n+i then a[i,j]:=1

else a[i,j]:=0;

For i:=1 to n do

begin k:=i;s:=a[i,i];

for j:=i+1 to n do

begin t:=a[j,i];

if abs(s)<abs(t) then begin s:=t;k:=j;end;end;

if abs(s)<e then begin

write('M- вироджена');Halt end;

For j:=i to n1 do

begin t:=a[k,j];a[k,j]:=a[i,j];a[i,j]:=t/s;end;

For k:=1 to n do

if k<>i then

For j:=n1 downto 1 do

a[k,j]:=a[k,j]-a[i,j]*a[k,i];end;

For i:=1 to n do

For j:=1 to n do

m[i,j]:=a[i,j+n];

For i:=1 to n do

For j:=1 to n do

For k:=1 to n do

C[i,j]:=C[i,j]+B[k,i]*M[j,k]; {Множення матриці на обернену}

For i:=1 to n do

For j:=1 to n do

writeln(C[i,j]:6:2); {Вивід результату}

End.

Результати:

n=3


1 2 3 1 2 3

M= 4 5 6 B= 4 5 6

7 8 9 7 8 9


1 0 0

C= 0 1 0

0 0 1

Початок


Ввід n,m


i=1,n


j=1,m


Ввід А[i,j]


i=1,n


j=1,m


Ввід B[i,j]


i=1,n


j=1,m


C[i,j]=A[i,j]+B[i,j]


i=1,n


j=1,m


Вивід С[i,j]


Кінець


Початок


Ввід n,m


i=1,n


j=1,m


Ввід А[i,j]


i=1,n


j=1,m


Ввід B[i,j]


i=1,n


j=1,m


C[i,j]=A[i,j]-B[i,j]


i=1,n


j=1,m


Вивід С[i,j]


Кінець

Початок


Ввід n,m,l


i=1,n


j=1,m


Ввід А[i,j]


i=1,l


j=1,n


Ввід B[i,j]