Використання елементарних перетворень для знаходження оберненої матриці

2

Міністерство освіти і науки України

Факультет інформатики









Курсова робота 





Тема: 

“Використання елементарних перетворень

для знахожження оберненої матриці ”













Виконав студент ІІ-го курсу

Факультету інформатики

Заочної форми навчання

Науковий керівник: 













Ужгород 2009


Зміст



	Зміст	2

	Вступ	3

	1. Теория	4

	2. Опис програми	8

	3. Програма	10

	Висновок	45

	Список використаної літератри	46




Вступ



Квадратна матриця називається виродженою (для особливої), якщо її визначник дорівнює нулю, і невиродженою (чи неособливої) - у протилежному випадку. Відповідно лінійне перетворення невідомих називається виродженим чи невиродженим у залежності від того, чи буде дорівнює чи нулю відмінний від нуля визначник з коефіцієнтів цього приобразования. З теореми випливає наступне твердження: 

Добуток матриць, хоча б одна з яких вироджена, буде вродженою матрицею. 

Добуток будь-яких невироджених матриць саме буде невирожденою матрицею. Звідси випливає, через зв'язок, що існує між множенням матриць і послідовним виконанням лінійних перетворень, таке твердження: результат послідовного виконання декількох лінійних перетворень тоді і тільки тоді буде невиродженим перетворенням, якщо всі задані перетворення невироджені. 




1. Теория



Квадратна матриця називається виродженою (для особливої), якщо її визначник дорівнює нулю, і невиродженою (чи неособливої) - у протилежному випадку. Відповідно лінійне перетворення невідомих називається виродженим чи невиродженим у залежності від того, чи буде дорівнює чи нулю відмінний від нуля визначник з коефіцієнтів цього приобразования. З теореми випливає наступне твердження: 

Добуток матриць, хоча б одна з яких вироджена, буде вродженою матрицею. 

Добуток будь-яких невироджених матриць саме буде невирожденою матрицею. Звідси випливає, через зв'язок, що існує між множенням матриць і послідовним виконанням лінійних перетворень, таке твердження: результат послідовного виконання декількох лінійних перетворень тоді і тільки тоді буде невиродженим перетворенням, якщо всі задані перетворення невироджені. 

Роль одиниці у множенні матриць грає одинична матриця

причому вона перестановочна з будь-якою матрицею А даним порядком

АЕ=ЕА=А (1) 

Доводяться ці чи рівності безпосереднім приминением правилаумножения матриць, чи ж на підставі зауваження, що еденичная матриця відповідає тотожному лінійний приобразованию невідомих

x1=y1

x2= y2

... ... ... . 

xn= yn

Виконання якого до чи після будь-якого іншого лінійного переутворення, очевидно не змінює цього останнього. 

Помітимо, що матриця Е є єдиною матрицею, що задовольняє умові (1) при будь-якій матриці А. Дійсно, якби існувала матриця Е' з цією же властивістю, то ми мали б

E’E=E’, E’E=E,

звідки E’=E. 

Питання про існування для даної матирцы А зворотної матриці виявляється болеее складним. Через некомутативности множення матриць ми будемо говорити зараз про праву зворотну матрицю, тоесть про таку зворотну матрицю А-1

Що добуток матриці А праворуч на цю матрицю дає еденичную матрицю,

AA-1=E (2) 

Якщо матриця А вырожденная, то, якби матриця А-1 існувала, добуток, що коштує в лівій частині рівності (2), було б, як ми знаємо, вырожденной матрицею, у той час як насправді матриця Е, що коштує в правій частині цієї рівності, є невырожденной, тому що його визначник дорівнює еденице. Таким чином, вырожденная матриця не може мати правої зворотної матриці. Такого ж розуміння показують, сто вона не має і лівої зворотний і тому для вырожденной матриці обратеая матриця воопше не існує. 

Переходячи до випадку невырожденной матриці, уведемо спочатку наступне допоміжне поняття. Нехай дана матриця n-го порядку



 a11 a12... a1n

a21 a22... a2n

А=... ... ... ... ... ... ... ... . 

an1 an1... ann


Матриця



a11 a12... a1n

A*= a21 a22... a2n 

... ... ... ... ... ... ... ... . 

an1 an1... ann



Складання з алгебраїчних доповнень до елементів матриці А, причому алгебраїчне доповнення до елементу aіj коштує на перетинанні j-й рядка й і-го стовпця, називається приєднаної (чи взаємної) до матриці А. 

Знайдемо добуток АА* і А*А. Використовуючи відому формулу розкладання визначника по чи рядку стовпцю, а також теорему про суму добутків елементів будь-якого рядка (стовпця) визначника на алгебраїчні доповнення до відповідних елементів іншого рядка (стовпця), і позначаючи через d визначник матриці А,

d=|A|,

ми одержимо наступні рівності: 



d 0...0

0 d...0

АА*=А*А=... ... ... . . (3) 

0 0... d



Звідси випливає, що якщо матриця А невырожденная, те її присоедененная матриця А* також буде невырожденной, причому визначник d* матриці А* дорівнює (n-1) - й ступеня визначника d матриці А. 

Справді, переходячи від рівностей (3) до рівності між визначниками, ми одержимо

dd*= dn,

звідки d≠0

d*= dn-1

Тепер можна довести існування зворотної матриці для всякої не виродженої матриці А и знайти її вид. Помітимо спочатку, що якщо ми розглянемо добуток двох матриць АВ і всі елементи одногоиз множників, наприклад У, розділимо на те саме число d, те всі елементи добутку АВ також розділяться на це ж число: для доказу потрібно лише згадати визначення множення матриць. Таки мобразом, якщо 

d=|A|≠0

те з рівностей (3) випливає, що зворотною матрицею для А буде служити матриця, що виходить із присоедененной матриці А* розподілом усіх її елементів на d: 



Дійсно, з (3) випливають рівності

(4) 

Ще раз підкреслимо, що в і-й рядку матриці А-1 коштують алгебраическиедополнения до елементів і-го стовпця визначника |А|, ділені на d=|A|. 

Легко довести що матриця А-1 є єдиною матрицею, що задовольняє умові (4) для даної невырожденной матриці А. Дійсно, якщо матриця З така, що

АС=СА=Е

то

САА-1=С(АА-1) =СЕ=С

САА-1=(СА) А-1=ЕА=А-1

Звідки С=А-1. 

З (4) і теореми про множення визначників випливає, що визначник матриці А-1 дорівнює, так що ця матриця так само 

буде невиродженою. Зворотної для неї служить матриця А. 

Якщо тепер дані квадратні матриці n-го порядку А и В, з яких А-невырожденная, а В - довільна, то ми можемо виконати правий і лівий розподіл У на А, тобто, вирішити матричні рівняння

AX=B, YA=B (5) 

Для цього, через асоціативності множення матриць, досить покласти

X=A-1B, Y=BA-1,

причому ці рішення рівнянь (5) буду, через некоммутативности множення матриць, у загальному випадку різними. 



2. Опис програми



Програма Matrtest. pas являється демо программою, котра показує роботу процедур з модуля Matr. pas. 

Модуль програми Matr. pas – в ній розміщені процедури і функції, котрі роблять перетворення матриць. 

У файлі – Time. dat записані коефіціенти матриці, розмірність матриці. Він мусить містити в собі початкову матрицю, і її розмірність, тому, що програма без цих даних працювати не буде. 

Нижче приведений “скрин” програми, тобто вигляд програми в роботі. 







3. Програма



{============================Matrtest. pas=========================}

Uses matr; 

Var A,C: MAtrix; 

Begin

A. VMT; C. VMT; 

Writeln(' Коэффициеты уравнения '); 

A. ReadOfText('time',' Коэффициеты уравнения '); 

A. WriteToText('con',7,3); 

Write('Enter'); Readln; 

Writeln('Обращаем матрицу коэффициентов'); 

C. RevWithGauss(A); 

C. WriteToText('con',7,3); 

Write('Enter'); Readln; 

End. 

{============================ Matr. pas ==========================}

{$A+,B-,D-,E-,F+,G+, I-,L-,N+,O-,P-,Q-,R-,S-,T+,V+,X+}

{$M 24000,32,655360}

Unit Matr; 

Interface

Const

CTooManySize=1; 

CBadPosition=2; 

CFileNotFound=3; 

CFileError=4; 

CReadError=5; {A}

CWriteError=6; {A}

COutOfData=7; 

CBadOperands=8; 

CMulError=9; {A}

CSearchError=10; 

CNotExist=11; 

CMNotSquare=12; 

CAddError=13; {A}

CReversError=14; {A}

CMDegenerate=15; 

CUnkNownError=16; 

CMDgError=17; {A}

CMSqrError=18; {A}

CDetError=19; {A}

CSortError=20; {A}

CDGaussError=21; {A}

CCuanZeeroError=22; {A}

CSwapError=23; {A}

CMulToNumError=24; {A}

CStopped=25; 

CDegrError=26; {A}

CIgError=27; {A}

CZFE=28; 

Type

TOE=Extended; 

Ar=Array [1. . (Word(Pred(0)) +1) div SizeOf(TOE)] of TOE; 

Ar31=Array [1. .31,1. .31] of TOE; 

Ar63=Array [1. .63,1. .63] of TOE; 

Tabl=Object

CBars,CLines: Byte; 

M: Pointer; {**}

SizeInMemory: Word; {**}

Errors: Set of Byte; 

Exist: Boolean; 

Constructor VMT; 

Procedure DataInit(L,B: Byte); Virtual; 

Procedure SetE(I,J: Byte; E: TOE); 

Function GetE(I,J: Byte): TOE; 

Procedure Del; 

Procedure ReadOfText(Name: String; Search: String); 

Procedure WriteToText(Name: String; F1,F2: Byte); 

Procedure AllClear; Virtual; {}

Procedure Let(Var A); Virtual; 

Procedure ZeeroFill; 

{ Errors }

Procedure TooManySize; Virtual; 

Procedure BadPosition; Virtual; 

Procedure FileNotFound; Virtual; 

Procedure FileError; Virtual; 

Procedure ReadError; Virtual; 

Procedure WriteError; Virtual; 

Procedure OutOfData; Virtual; 

Procedure SearchError; Virtual; 

Procedure NotExist; Virtual; 

Procedure UnkNownError; Virtual; 

Procedure AnyError; Virtual; 

Procedure ZFE; Virtual; 

End; 

Line=Set of Byte; 

Mem=Record

mPlus: Boolean; 

mDirection: Boolean; 

mSortLines: Boolean; 

mBeginZeero: Boolean; 

mSpecialSort: Boolean; 

mGauss: Boolean; 

mDetForRev: Boolean; 

End; 

Matrix=Object(Tabl) 

Lin,Bar: Line; 

Plus: Boolean; 

Direction: Boolean; 

SortLines: Boolean; 

BeginZeero: Boolean; 

SpecialSort: Boolean; 

Chek: Integer; 

Gauss: Boolean; 

DetForRev: Boolean; {ўбҐ Ї а ¬Ґвал - ў­гваҐ­­ЁҐ}

{Mem}

Procedure AllClear; virtual; 

Function SIgn(C: Word): TOE; 

Procedure Revers(Var A: Matrix); {®Ўа й Ґв бҐЎп ¬Ґ¤«Ґ­­л¬ бЇ®б®Ў®¬}

Procedure RevWithGauss(Var A: Matrix); {®Ўа й Ґв бҐЎ ­ ў®а®зҐ­­л¬ бЇ®б®Ў®¬}

Procedure InnerRevers(Var A: Matrix); Virtual; 

Procedure ZeeroSortBars; 

Procedure ZeeroSortLines; 

Procedure UniversalSort; 

Function DetWithGauss: TOE; Virtual; {®Ўа й Ґв бҐЎп ­ ў®а®зҐ­­л¬ (Ўлбвал¬) бЇ®б®Ў®¬}

Function CuanZeeroInLine(L1: Integer): Integer; 

Procedure SwapLines(L1,L2: Integer); Virtual; 

Procedure SwapBars(B1,B2: Integer); 

Function CuanZeeroInBar(B1: Integer): Integer; 

Procedure SpecialSortLines; 

Procedure SpecialSortBars; 

Procedure SelfClear; Virtual; 

Procedure StepRevers; Virtual; 

Procedure RemSettings(Var FM: Mem); Virtual; 

Procedure RestoreSettings(Var FM: Mem); Virtual; 

Procedure MSqr(Var A: Matrix); {ў®§ў®¤Ёв ўбҐ н«Ґ¬Ґ­вл ¬ ваЁжл ў Єў ¤а в}

Procedure MDg(Var A: Matrix); 

{errors}

Procedure BadOperands; Virtual; 

Procedure MulError; Virtual; 

Procedure MNotSquare; Virtual; 

Procedure AddError; Virtual; 

Procedure ReversError; Virtual; 

Procedure MDegenerate; Virtual; 

Procedure MDgError; Virtual; 

Procedure MSqrError; Virtual; 

Procedure DetError; Virtual; 

Procedure SortError; Virtual; 

Procedure DGaussError; Virtual; 

Procedure CuanZeeroError; Virtual; 

Procedure SwapError; Virtual; 

Procedure MulToNumError; Virtual; 

Procedure Stopped; Virtual; 

Procedure DegrError; Virtual; 

Procedure IgError; Virtual; 

End; 

Matrix31=Object(Matrix) 

Function DetWithGauss: TOE; Virtual; 

Procedure SwapLines(L1,L2: Integer); Virtual; 

End; 

Matrix63=Object(Matrix) 

Function DetWithGauss: TOE; Virtual; 

Procedure SwapLines(L1,L2: Integer); Virtual; 

End; 

Implementation

{**************************************************************************}

Procedure TAbl. ZeeroFill; 

Var i,j: Integer; 

Begin

IF Not Exist Then Begin NotExist; ZFE; Exit; End; 

IF (Errors<> [0]) Then Begin ZFE; Exit; End; 

For i: =1 to CLines do

For j: =1 to CBars do

SetE(i,j,0); 

End; 

Procedure Tabl. Let(Var A); 

Begin

End; 

Procedure Tabl. AllClear; 

Begin

CBars: =0; 

CLines: =0; 

SizeInMemory: =0; 

Errors: = [0] ; 

M: =Nil; 

End; 

Procedure Tabl. DataInit(L,B: Byte); 

Begin

IF Exist Then Del; 

AllClear; 

IF 1.0*SizeOf(TOE) *L*B>(Word(Pred(0)) +1) *1.0 Then Begin TooManySize; Exit; End; 

CBars: =B; 

CLines: =L; 

SizeInMemory: =SizeOf(TOE) *CBars*CLines; 

If MaxAvail < SizeInMemory Then Begin TooManySize; Exit; End; 

GetMem(M,SizeInMemory); 

Exist: =True; 

End; 

Procedure Tabl. SetE(I,J: Byte; E: TOE); 

Begin

IF Errors<> [0] Then Exit; 

IF Not Exist Then Begin NotExist; Exit; End; 

IF (I>CLines) or (J>CBars) or (I<1) or (J<1) Then Begin BadPosition; Exit; End; 

Ar(M^) [((I-1) *CBars+J)]: =E; 

End; 

Function Tabl. GetE(I,J: Byte): TOE; 

Begin

IF Errors<> [0] Then Exit; 

IF Not Exist Then Begin NotExist; Exit; End; 

IF (I>CLines) or (J>CBars) or (I<1) or (J<1) 

Then

Begin

GetE: =0.0; 

BadPosition; 

End

Else

GetE: =Ar(M^) [((I-1) *CBars+J)] ; 

End; 

Procedure Tabl. Del; 

Begin

IF Errors<> [0] Then Exit; 

IF Not Exist Then Begin NotExist; Exit; End; 

IF SizeInMemory<>0 Then FreeMem(M,SizeInMemory); 

AllClear; 

Exist: =False; 

End; 

Procedure Tabl. ReadOfText(Name: String; Search: String); 

Var F: Text; 

I,J: Byte; 

Prom: TOE; 

Help: Integer; 

Function Searcher: Boolean; 

Var Prom: String; 

Begin

Repeat

Readln(F,Prom); 

IF IOResult<>0 Then Begin ReadError; Close(F); Exit; End; 

Until (EOF(F)) or (Pos(Search,Prom) <>0); 

IF Pos(Search,Prom) =0

Then

Begin

SearchError; 

Searcher: =False; 

End

Else Searcher: =True; 

End; 

Begin

IF Exist Then Del; 

Assign(F,Name); 

{$I-}

Reset(F); 

IF IOResult=2 Then Begin FileNotFound; ReadError; Exit; End; 

IF IOResult<>0 Then Begin FileError; ReadError; Exit; End; 

IF Not Searcher Then Exit; 

Readln(F,CLines); 

IF IOResult<>0 Then Begin AllClear; ReadError; Close(F); Exit; End; 

Readln(F,CBars); 

IF IOResult<>0 Then Begin AllClear; ReadError; Close(F); Exit; End; 

DataInit(CLines,CBars); 

IF Errors<> [0] Then Exit; 

IF Not Exist Then Exit; 

For I: =1 to CLines do

For J: =1 to CBars do

Begin

Read(F,Prom); 

IF (EOF(F)) and (I<>CLines) And (I<>CBars) Then Begin Del; OutOfData; ReadError; Close(F); Exit; End; 

IF IOResult<>0 Then Begin Del; ReadError; Close(F); Exit; End; 

SetE(I,J,Prom); 

End; 

Close(F); 

{$I+}

End; 

Procedure Tabl. WriteToText(Name: String; F1,F2: Byte); 

Var F: Text; 

I,J: Byte; 

Begin

IF Errors<> [0] Then Exit; 

IF Not Exist Then Begin NotExist; WriteError; Exit; End; 

Assign(F,Name); 

{$I-}

ReWrite(F); 

IF IOResult<>0 Then Begin FileError; WriteError; Exit; End; 

For I: =1 to CLines do

Begin

For J: =1 to CBars do

Begin

Write(F,GetE(I,J): F1: F2,' '); 

IF IOResult<>0 Then Begin Close(F); WriteError; Exit; End; 

End; 

Writeln(F) 

End; 

Close(F); 

{$I+}

End; 

Procedure Tabl. TooManySize; 

Begin

Errors: =Errors+ [CTooManySize] ; 

AnyError

End; 

Procedure Tabl. BadPosition; 

Begin

Errors: =Errors+ [CBadPosition] ; 

AnyError

End; 

Procedure Tabl. FileNotFound; 

Begin

Errors: =Errors+ [CFileNotFound] ; 

AnyError

End; 

Procedure Tabl. FileError; 

Begin

Errors: =Errors+ [CFileError] ; 

AnyError

End; 

Procedure Tabl. ReadError; 

Begin

Errors: =Errors+ [CReadError] ; 

AnyError

End; 

Procedure Tabl. WriteError; 

Begin

Errors: =Errors+ [CWriteError] ; 

AnyError

End; 

Procedure Tabl. OutOfData; 

Begin

Errors: =Errors+ [COutOfData] ; 

AnyError

End; 

Procedure Tabl. SearchError; 

Begin

Errors: =Errors+ [CSearchError] ; 

AnyError

End; 

Procedure Tabl. NotExist; 

Begin

Errors: =Errors+ [CNotExist] ; 

AnyError

End; 

Procedure Tabl. ZFE; 

Begin

Errors: =Errors+ [CZFE] ; 

AnyError

End; 

Procedure Tabl. UnkNownError; 

Begin

Errors: =Errors+ [CUnkNownError] ; 

AnyError

End; 

Procedure Tabl. AnyError; 

Begin

End; 

Constructor TAbl. VMT; 

Begin

Exist: =False; 

End; 

Procedure Matrix. MSqr; 

Var i,j: Integer; 

Begin

IF Not A. Exist Then Begin A. NotExist; BadOperands; MSqrError; Exit; End; 

IF A. Errors<> [0] Then Begin MsqrError; Exit; End; 

IF Self. Exist Then Del; 

Self. DataInit(A. CLines,A. CBars); 

For i: =1 to CLines do

For j: =1 to CBars do

SetE(i,j,Sqr(A. GetE(i,j))); 

Self. SelfClear; 

End; 

Procedure Matrix. MDg; 

Var i,j: Integer; 

Begin

IF Not A. Exist Then Begin A. NotExist; BadOperands; MDgError; Exit; End; 

IF A. Errors<> [0] Then Begin MDgError; Exit; End; 

IF A. CLines<>A. CBars Then Begin MNotSquare; MDgError; Exit; End; 

IF Exist Then Del; 

DataInit(A. CLines,A. CBars); 

For i: =1 to A. CLines do

For j: =1 to A. CBars do

IF i=j Then SetE(i,j,A. GetE(i,j)) 

Else SetE(i,j,0); 

Self. SelfClear; 

End; 

Procedure Matrix. BadOperands; 

Begin

Errors: =Errors+ [CBadOperands] ; 

AnyError; 

End; 

Procedure Matrix. MulError; 

Begin

Errors: =Errors+ [CMulError] ; 

AnyError; 

End; 

Procedure Matrix. MDgError; 

Begin

Errors: =Errors+ [CMDgError] ; 

AnyError; 

End; 

Procedure Matrix. SortError; 

Begin

Errors: =Errors+ [CSortError] ; 

AnyError; 

End; 

Procedure Matrix. DetError; 

Begin

Errors: =Errors+ [CDetError] ; 

AnyError; 

End; 

Procedure Matrix. DGaussError; 

Begin

Errors: =Errors+ [CDGaussError] ; 

AnyError; 

End; 

Procedure Matrix. MSqrError; 

Begin

Errors: =Errors+ [CMSqrError] ; 

AnyError; 

End; 

Procedure MAtrix. CuanZeeroError; 

Begin

Errors: =Errors+ [CCuanZeeroError] ; 

AnyError; 

End; 

Procedure MAtrix. SwapError; 

Begin

Errors: =Errors+ [CSwapError] ; 

AnyError; 

End; 

Procedure Matrix. MulToNumError; 

Begin

Errors: =Errors+ [CMulToNumError] ; 

AnyError

End; 

Procedure Matrix. DegrError; 

Begin

Errors: =Errors+ [CDegrError] ; 

AnyError

End; 

Procedure Matrix. IgError; 

Begin

Errors: =Errors+ [CIgError] ; 

AnyError

End; 

Procedure MAtrix. SelfClear; 

Begin

Lin: = [0] ; 

Bar: = [0] ; 

Plus: =True; 

Direction: =True; 

SortLines: =True; 

BeginZeero: =True; 

SpecialSort: =False; 

Chek: =0; 

Gauss: =False; 

DetForRev: =False; 

End; 

Procedure Matrix. AllClear; 

Begin

inherited AllClear; 

SelfClear; 

End; 

Procedure Matrix. Revers; 

VAr FM: Mem; 

Begin

Gauss: =False; 

InnerRevers(A); 

End; 

Procedure Matrix. RevWithGauss; 

Var FM: Mem; 

Begin

Gauss: =True; 

InnerRevers(A); 

End; 

Procedure Matrix. InnerRevers; 

Var P,A1: Matrix; 

D: TOE; 

i,j: Integer; 

Var Ver: TOE; 

Var FM: Mem; 

Begin

IF Not A. Exist Then Begin A. NotExist; BadOperands; ReversError; Exit; End; 

IF (A. Errors<> [0]) Then Begin Exit; ReversError; End; 

IF (A. CBars<>A. Clines) Then Begin BadOperands; ReversError; Exit; End; 

P. VMT; 

P. DataInit(A. CLines,A. CBars); 

A1. VMT; 

A1: =A; 

IF A1. CLines=31 Then Begin Matrix31(A1). VMT; A1. Exist: =True; End; 

IF A1. CLines=63 Then Begin Matrix63(A1). VMT; A1. Exist: =True; End; 

IF Gauss Then D: =A1. DetWithGauss; 

IF D=0 Then

Begin

MDegenerate; 

ReversError; 

Exit; 

End; 

DetForRev: =True; 

For i: =1 to P. Clines do

Begin

A. StepRevers; 

For j: =1 to P. CBars do

Begin

A1. Lin: =A1. Lin+ [i] ; 

A1. Bar: =A1. Bar+ [j] ; 

IF Gauss Then Ver: =A1. DetWithGauss; 

IF (A1. Errors<> [0]) or (A. Errors<> [0]) Then Begin ReversError; Exit; End; 

P. SetE(j, i,(Ver) *Sign(i+j) /D); 

A1. Lin: =A1. Lin- [i] ; 

A1. Bar: =A1. Bar- [j] ; 

End; 

End; 

IF Self. Exist Then Self. del; 

Self: =P; 

Self. SelfClear; 

End; 

Procedure Matrix. SwapBars(B1,B2: Integer); 

Var Prom: TOE; 

i: Integer; 

Begin

IF Not Exist Then BEgin NotExist; SwapError; Exit; End; 

IF (Errors<> [0]) Then Begin SwapError; Exit; End; 

For i: =1 to CLines do

Begin

Prom: =GetE(i,B1); 

SetE(i,B1,GetE(i,B2)); 

SetE(i,B2,Prom) 

End; 

End; 

Function Matrix. CuanZeeroInBar(B1: Integer): Integer; 

Var i: Integer; 

Sum: Integer; 

Begin

IF Not Exist Then Begin NotExist; CuanZeeroError; Exit; End; 

IF (Errors<> [0]) Then Begin CuanZeeroError; Exit; End; 

Sum: =0; 

IF Not SpecialSort

Then

For i: =1 to CLines do IF GetE(i,B1) =0 Then Inc(Sum) else

Else

IF BeginZeero

Then

Begin

Sum: =1; 

While (GetE(Sum,B1) =0) and (Sum<=CLines) do inc(Sum); 

Dec(Sum); 

End

Else

Begin

Sum: =CLines; 

While (GetE(Sum,B1) =0) and (Sum>0) do Dec(Sum); 

Sum: =Clines-Sum; 

End; 

CuanZeeroinBar: =Sum; 

End; 

Procedure Matrix. ZeeroSortBars; 

Var i,j: Integer; 

Max,NMax,CZ: Integer; 

FM: Mem; 

Begin

IF Not Exist Then Begin NotExist; Exit; End; 

IF (Errors<> [0]) Then Exit; 

RemSettings(FM); 

SortLines: =False; 

SpecialSort: =False; 

UniversalSort; 

RestoreSettings(FM); 

End; 

Function Matrix. CuanZeeroinLine(L1: Integer): Integer; 

Var i: Integer; 

Sum: Integer; 

Begin

IF Not Exist Then Begin NotExist; CuanZeeroError; Exit; End; 

IF (Errors<> [0]) Then Begin CuanZeeroError; Exit; End; 

Sum: =0; 

IF Not SpecialSort

Then

For i: =1 to CBars do IF GetE(L1, i) =0 Then Inc(Sum) else

Else

IF BeginZeero

Then

Begin

Sum: =1; 

While (GetE(L1,Sum) =0) and (Sum<=CBars) do inc(Sum); 

Dec(Sum); 

End

Else

Begin

Sum: =CBars; 

While (GetE(L1,Sum) =0) and (Sum>0) do Dec(Sum); 

Sum: =CBars-Sum; 

End; 

CuanZeeroinLine: =Sum; 

End; 

Procedure Matrix. SwapLines(L1,L2: Integer); 

Var Prom: TOE; 

i: Integer; 

Begin

IF Not Exist Then Begin NotExist; SwapError; Exit; End; 

IF (Errors<> [0]) Then Begin SwapError; Exit; End; 

For i: =1 to CBars do

Begin

Prom: =GetE(L1, i); 

SetE(L1, i,GetE(L2, i)); 

SetE(L2, i,Prom) 

End; 

End; 

Procedure Matrix. ZeeroSortLines; 

VAr FM: Mem; 

Begin

IF Not Exist Then Begin NotExist; Exit; End; 

IF (Errors<> [0]) Then Exit; 

RemSettings(FM); 

SortLines: =True; 

SpecialSort: =False; 

UniversalSort; 

RestoreSettings(FM); 

End; 

Procedure Matrix. UniversalSort; 

Var i,j: Integer; 

Max,NMax,CZ: Integer; 

Cuan: Integer; 

Begin

IF Not Exist Then Begin NotExist; SortError; Exit; End; 

IF (Errors<> [0]) Then Begin SortError; Exit; End; 

IF SortLines Then Cuan: =CLines

Else Cuan: =CBars; 

For i: =1 to Cuan do

Begin

IF SortLines Then Max: =CuanZeeroInLine(i) 

Else Max: =CuanZeeroInBar(i); 

Nmax: =i; 

For j: =i to Cuan do

Begin

IF SortLines Then CZ: =CuanZeeroInLine(j) 

Else CZ: =CuanZeeroInBar(j); 

IF (CZ<Max) xor Direction

Then

Begin

Max: =CZ; 

NMax: =j; 

End; 

End; 

IF i<>NMax Then

Begin

IF SortLInes Then SwapLines(i,NMax) 

Else SwapBars(i,NMax); 

Inc(Chek); 

End; 

End; 

End; 

Function Matrix. DetWithGauss: TOE; 

Var i,j: Integer; 

K: TOE; 

P: TOE; 

S: Matrix; 

Si,Sj: Integer; 

Procedure SortLinesOfTheBar(B1: Integer); 

Var i: Integer; 

Max: TOE; 

nMax: Integer; 

Begin

Max: =S. GetE(1,B1); 

nMax: =1; 

For i: =2 to S. Clines do

IF Abs(Max) <Abs(S. GetE(i,B1)) 

Then

Begin

Max: =S. GetE(i,B1); 

nMAx: =i; 

End; 

IF S. Clines<>nMAx Then

Begin

S. SwapLines(S. Clines,nMAx); 

Inc(S. Chek); 

End; 

End; 

Procedure AddLines(l1,l2: Integer; K: TOE); 

Var i: Integer; 

Begin

For i: =1 to S. CBars do

S. SetE(l2, i,(S. GetE(l2, i) - S. GetE(l1, i) *K)); 

End; 

Procedure InitObject; 

Var i,j: Integer; 

Ver: TOE; 

Begin

Si: =0; 

Sj: =0; 

For i: =1 to CLines do IF not (i in Lin) Then Inc(Si); 

For j: =1 to CBars do IF not (j in Bar) Then Inc(sj); 

S. VMT; 

S. DataInit(Si,Sj); 

Si: =0; 

For i: =1 to CLines do

IF not (i in Lin) Then

Begin

Inc(Si); 

Sj: =0; 

For j: =1 to CBars do

IF not (j in Bar) Then

Begin

Inc(sj); 

Ver: =GetE(i,j); 

S. SetE(Si,Sj,Ver); 

End

End; 

End; 

Begin

IF Not Exist Then Begin NotExist; DGaussError; Exit; End; 

IF (Errors<> [0]) Then Begin DGaussError; Exit; End; 

IF CBars<>CLines Then Begin MNotSquare; DGaussError; Exit; End; 

InitObject; 

IF S. CBars<>S. CLines Then Begin MNotSquare; DGaussError; Exit; End; 

For i: =Si downto 2 do

Begin

S. Clines: =i; 

SortLinesOfTheBar(i); 

S. Clines: =Si; 

IF S. GetE(i, i) =0 Then Begin DetWithGauss: =0; Exit; End; 

For j: =i-1 downto 1 do

IF S. GetE(j, i) <>0 Then

Begin

K: =S. GetE(j, i) /S. GetE(i, i); 

AddLines(i,j,K); 

End; 

End; 

P: =1; 

S. Clines: =Si; 

S. CBars: =Sj; 

For i: =1 to S. Clines do

P: =P*S. GetE(i, i); 

DetWithGauss: =P*S. Sign(S. Chek); 

S. Del; 

End; 

Function Matrix. Sign; 

Begin

IF (C div 2) *2=C Then Sign: =1.0 Else Sign: =-1.0; 

End; 

Procedure Matrix. SpecialSortLines; 

VAr FM: Mem; 

Begin

IF Not Exist Then Begin NotExist; Exit; End; 

IF (Errors<> [0]) Then Exit; 

RemSettings(FM); 

SpecialSort: =True; 

SortLines: =True; 

UniversalSort; 

RestoreSettings(FM); 

End; 

Procedure Matrix. SpecialSortBars; 

VAr FM: Mem; 

Begin

IF Not Exist Then Begin NotExist; Exit; End; 

IF (Errors<> [0]) Then Exit; 

RemSettings(FM); 

SpecialSort: =True; 

SortLines: =False; 

UniversalSort; 

RestoreSettings(FM); 

End; 

Procedure RemSettings; 

Begin

End; 

Procedure MAtrix. MNotSquare; 

Begin

Errors: =Errors+ [CMNotSquare] ; 

AnyError

End; 

Procedure Matrix. AddError; 

Begin

Errors: =Errors+ [CAddError] ; 

AnyError

End; 

Procedure Matrix. ReversError; 

Begin

Errors: =Errors+ [CReversError] ; 

AnyError

End; 

Procedure Matrix. MDegenerate; 

Begin

Errors: =Errors+ [CMDegenerate] ; 

AnyError

End; 

Procedure Matrix. Stopped; 

Begin

Errors: =Errors+ [CStopped] ; 

AnyError

End; 

Procedure Matrix. StepRevers; 

Begin

End; 

Procedure Matrix. RemSettings; 

Begin

With FM do

Begin

mPlus: = Plus; 

mDirection: = Direction; 

mSortLines: = SortLines; 

mBeginZeero: = BeginZeero; 

mSpecialSort: = SpecialSort; 

mGauss: = Gauss; 

mDetForRev: = DetForRev; 

End

End; 

Procedure Matrix. RestoreSettings; 

Begin

With FM do

Begin

Plus: = mPlus; 

Direction: = mDirection; 

SortLines: = mSortLines; 

BeginZeero: = mBeginZeero; 

SpecialSort: = mSpecialSort; 

Gauss: = mGauss; 

DetForRev: = mDetForRev; 

End; 

End; 

{********************************Quick metods *****************************}

Function Matrix31. DetWithGauss; 

Var i,j: Integer; 

K: TOE; 

P: TOE; 

S: Matrix31; 

si,sj: Integer; 

Procedure SortLinesOfTheBar(B1: Integer); 

Var i: Integer; 

Max: TOE; 

nMax: Integer; 

Begin

Max: =Ar31(S. M^) [1,B1] ; 

nMax: =1; 

For i: =2 to S. Clines do

IF Abs(Max) <Abs(Ar31(S. M^) [i,B1]) 

Then

Begin

Max: =Ar31(S. M^) [i,B1] ; 

nMAx: =i; 

End; 

IF S. Clines<>nMAx Then

Begin

S. SwapLines(S. Clines,nMAx); 

Inc(S. Chek); 

End; 

End; 

Procedure AddLines(l1,l2: Integer; K: TOE); 

Var i: Integer; 

Begin

For i: =1 to S. CBars do

Begin

Ar31(S. M^) [l2, i]: =Ar31(S. M^) [l2, i] -Ar31(S. M^) [l1, i] *K; 

End; 

End; 

Procedure InitObject; 

Var i,j: Integer; 

Ver: TOE; 

Begin

S. VMT; 

S. DataInit(31,31); 

Si: =0; 

IF DetForRev

Then

Begin

si: =31; 

sj: =31; 

Ar31(S. M^): =Ar31(M^) 

End

Else

For i: =1 to CLines do

IF not (i in Lin) Then

Begin

Inc(Si); 

Sj: =0; 

For j: =1 to CBars do

IF not (j in Bar) Then

Begin

Inc(sj); 

Ar31(S. M^) [Si,Sj]: =Ar31(M^) [i,j] ; 

End

End; 

End; 

Begin

IF Not Exist Then Begin NotExist; DGaussError; Exit; End; 

IF (Errors<> [0]) Then Begin DGaussError; Exit; End; 

IF CBars<>CLines Then Begin MNotSquare; DGaussError; Exit; End; 

InitObject; 

S. Clines: =si; 

S. CBars: =sj; 

IF S. CBars<>S. CLines Then Begin MNotSquare; DGaussError; Exit; End; 

For i: =si downto 2 do

Begin

S. Clines: =i; 

SortLinesOfTheBar(i); 

S. Clines: =si; 

IF Ar31(S. M^) [i, i] =0 Then Begin DetWithGauss: =0; Exit; End; 

For j: =i-1 downto 1 do

IF Ar31(S. M^) [j, i] <>0 Then

Begin

K: =Ar31(S. M^) [j, i] /Ar31(S. M^) [i, i] ; 

AddLines(i,j,K); 

End; 

End; 

P: =1; 

S. Clines: =si; 

S. CBars: =sj; 

For i: =1 to S. Clines do

P: =P*Ar31(S. M^) [i, i] ; 

DetWithGauss: =P*S. Sign(S. Chek); 

S. Del; 

End; 

Procedure Matrix31. SwapLines(L1,L2: Integer); 

Var Prom: TOE; 

i: Integer; 

Begin

IF Not Exist Then BEgin NotExist; SwapError; Exit; End; 

IF (Errors<> [0]) Then Begin SwapError; Exit; End; 

For i: =1 to CBars do

Begin

Prom: =Ar31(M^) [L1, i] ; 

Ar31(M^) [L1, i]: =Ar31(M^) [L2, i] ; 

Ar31(M^) [L2, i]: =Prom

End; 

End; 

{-------------------------------------------------------------------------}

Function Matrix63. DetWithGauss; 

Var i,j: Integer; 

K: TOE; 

P: TOE; 

S: Matrix63; 

si,sj: Integer; 

Procedure SortLinesOfTheBar(B1: Integer); 

Var i: Integer; 

Max: TOE; 

nMax: Integer; 

Begin

Max: =Ar63(S. M^) [1,B1] ; 

nMax: =1; 

For i: =2 to S. Clines do

IF Abs(Max) <Abs(Ar63(S. M^) [i,B1]) 

Then

Begin

Max: =Ar63(S. M^) [i,B1] ; 

nMAx: =i; 

End; 

IF S. Clines<>nMAx Then

Begin

S. SwapLines(S. Clines,nMAx); 

Inc(S. Chek); 

End; 

End; 

Procedure AddLines(l1,l2: Integer; K: TOE); 

Var i: Integer; 

Begin

For i: =1 to S. CBars do

Begin

Ar63(S. M^) [l2, i]: =Ar63(S. M^) [l2, i] -Ar63(S. M^) [l1, i] *K; 

End; 

End; 

Procedure InitObject; 

Var i,j: Integer; 

Ver: TOE; 

Begin

S. VMT; 

S. DataInit(63,63); 

Si: =0; 

IF DetForRev

Then

Begin

si: =63; 

sj: =63; 

Ar63(S. M^): =Ar63(M^) 

End

Else

For i: =1 to CLines do

IF not (i in Lin) Then

Begin

Inc(Si); 

Sj: =0; 

For j: =1 to CBars do

IF not (j in Bar) Then

Begin

Inc(sj); 

Ar63(S. M^) [Si,Sj]: =Ar63(M^) [i,j] ; 

End

End; 

End; 

Begin

IF Not Exist Then Begin NotExist; DGaussError; Exit; End; 

IF (Errors<> [0]) Then Begin DGaussError; Exit; End; 

IF CBars<>CLines Then Begin MNotSquare; DGaussError; Exit; End; 

InitObject; 

S. Clines: =si; 

S. CBars: =sj; 

IF S. CBars<>S. CLines Then Begin MNotSquare; DGaussError; Exit; End; 

For i: =si downto 2 do

Begin

S. Clines: =i; 

SortLinesOfTheBar(i); 

S. Clines: =si; 

IF Ar63(S. M^) [i, i] =0 Then Begin DetWithGauss: =0; Exit; End; 

For j: =i-1 downto 1 do

IF Ar63(S. M^) [j, i] <>0 Then

Begin

K: =Ar63(S. M^) [j, i] /Ar63(S. M^) [i, i] ; 

AddLines(i,j,K); 

End; 

End; 

P: =1; 

S. Clines: =si; 

S. CBars: =sj; 

For i: =1 to S. Clines do

P: =P*Ar63(S. M^) [i, i] ; 

DetWithGauss: =P*S. Sign(S. Chek); 

S. Del; 

End; 

Procedure Matrix63. SwapLines(L1,L2: Integer); 

Var Prom: TOE; 

i: Integer; 

Begin

For i: =1 to CBars do

Begin

Prom: =Ar63(M^) [L1, i] ; 

Ar63(M^) [L1, i]: =Ar63(M^) [L2, i] ; 

Ar63(M^) [L2, i]: =Prom

End; 

End; 

END. 





Контрольні приклади

Дана матриця: 

 3 - 1 0

А= - 2 1 1

2 - 1 4

Відповідь: 



1 0,8 - 0,2

А-1 = 2 2,4 - 0,6

0 0,2 0,2




Висновок



Квадратна матриця називається виродженою (для особливої), якщо її визначник дорівнює нулю, і невиродженою (чи неособливої) - у протилежному випадку. Відповідно лінійне перетворення невідомих називається виродженим чи невиродженим у залежності від того, чи буде дорівнює чи нулю відмінний від нуля визначник з коефіцієнтів цього приобразования. З теореми випливає наступне твердження: 

Добуток матриць, хоча б одна з яких вироджена, буде вродженою матрицею. 

Добуток будь-яких невироджених матриць саме буде невирожденою матрицею. Звідси випливає, через зв'язок, що існує між множенням матриць і послідовним виконанням лінійних перетворень, таке твердження: результат послідовного виконання декількох лінійних перетворень тоді і тільки тоді буде невиродженим перетворенням, якщо всі задані перетворення невироджені. 




Список використаної літератри



1. А.Г. Курош «курс высшей алгебры», «наука», Москва 1975

2.С.Т. Завало, В.М. Костарчук, Б.И. Хацет «алгебра и теория чисел», Том 1,«высшая школа», Киев 1974

3. С.Т. Завало, В.М. Костарчук, Б.И. Хацет «алгебра и теория чисел», Том 2, «высшая школа», Киев 1976