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

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

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

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

Тема:

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

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

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

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

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

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

Ужгород 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