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

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

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


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


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


Тема:


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


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


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


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


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


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


Ужгород 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. .3
1,1. .3
1] of TOE;


Ar63=Array [1. .6
3,1. .6
3] 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] ;


Any

Error;


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

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

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

Слов:4934
Символов:45009
Размер:87.91 Кб.