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

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Міністерство освіти і науки України
Курсова робота
Тема:
Программа на С++ Builder для знаходження оберненої матриці з використання елементарних перетворень

Зміст

  Теория. 3
Опис програми. 7
Список використаної літератури. 43

Теория

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


причому вона перестановочна з будь-якою матрицею А даним порядком
АЕ=ЕА=А (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
A= 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) буду, через некоммутативности множення матриць, у загальному випадку різними.

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

Програма Matrtest. pas являється демо програмою, котра показує роботу процедур з модуля Matr. pas.
Модуль програми Matr. pas – в ній розміщені процедури і функції, котрі роблять перетворення матриць.
У файлі – Time. dat записані коефіцієнти матриці, розмірність матриці. Він мусить містити в собі початкову матрицю, і її розмірність, тому, що програма без цих даних працювати не буде.
Нижче приведений “скрин” програми, тобто вигляд програми в роботі.

Програма
{============================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.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
48.1кб. | скачати


Схожі роботи:
Використання елементарних перетворень для знаходження оберненої матриці
Знаходження оберненої матриці за формулою
Розвязання рівнянь методом оберненої матриці та методом Гауса
Використання матриці витрат для оцінки ефекту масштабу або охоплення
Программа для перегляду текстових файлів різного розміру
Розробка візуальних компонентів для середовища З Builder
Створення ігрової програми шашки для гри між людиною і комп`ютером на мові С Builder
Проект програмного модуля для знаходження кореня рівняння
Програма для знаходження нижньої та верхньої межі дійсних коренів
© Усі права захищені
написати до нас