|
Программа на С++ Builder для знаходження оберненої матриці з використання елементарних перетворень
Программа на С++ Builder для знаходження оберненої матриці з використання елементарних перетворень
3 Міністерство освіти і науки України Курсова робота Тема: Программа на С++ Builder для знаходження оберненої матриці з використання елементарних перетворень ЗмістТеория 3- Опис програми 7
- Список використаної літератури 43
ТеорияКвадратна матриця називається виродженою (для особливої), якщо її визначник дорівнює нулю, і невиродженою (чи неособливої) - у протилежному випадку. Відповідно лінійне перетворення невідомих називається у залежності від того, чи буде дорівнює чи нулю відмінний від нуля визначник з коефіцієнтів цього перетворення. З теореми випливає наступне твердження: Добуток матриць, хоча б одна з яких вироджена, буде вродженою матрицею. Добуток будь-яких невироджених матриць саме буде невирожденою матрицею. Звідси випливає, через зв'язок, що існує між множенням матриць і послідовним виконанням лінійних перетворень, таке твердження: результат послідовного виконання декількох лінійних перетворень тоді і тільки тоді буде невиродженим перетворенням, якщо всі задані перетворення невироджені. Роль одиниці у множенні матриць грає одинична матрицяпричому вона перестановочна з будь-якою матрицею А даним порядкомАЕ=ЕА=А (1) Доводяться ці чи рівності безпосереднім приминением правила умножения матриць, чи ж на підставі зауваження, що еденичная матриця відповідає тотожному лінійний перетворень невідомихx1=y1x2= y2... ... ... . xn= ynВиконання якого до чи після будь-якого іншого лінійного переутворення, очевидно не змінює цього останнього. Помітимо, що матриця Е є єдиною матрицею, що задовольняє умові (1) при будь-якій матриці А. Дійсно, якби існувала матриця Е' з цією же властивістю, то ми мали бE'E=E', E'E=E,звідки E'=E. Питання про існування для даної матриці А зворотної матриці виявляється більш складним. Через некомутативности множення матриць ми будемо говорити зараз про праву зворотну матрицю, тобто про таку зворотну матрицю А-1Що добуток матриці А праворуч на цю матрицю дає одиничну матрицю,AA-1=E (2) Якщо матриця А вироджена, то, якби матриця А-1 існувала, добуток, що коштує в лівій частині рівності (2), було б, як ми знаємо, виродженою матрицею, у той час як насправді матриця Е, що коштує в правій частині цієї рівності, є невиродженою, тому що його визначник дорівнює одиниці. Таким чином, вироджена матриця не може мати правої зворотної матриці. Такого ж розуміння показують, сто вона не має і лівої зворотний і тому для вироджена матриці обернута матриця взагалі не існує. Переходячи до випадку невироджденої матриці, уведемо спочатку наступне допоміжне поняття. Нехай дана матриця n-го порядкуa11 a12... a1nA= a21 a22... a2n... ... ... ... ... ... ... ... . an1 an1... annМатрицяa11 a12... a1nA*= a21 a22... a2n ... ... ... ... ... ... ... ... . an1 an1... annСкладання з алгебраїчних доповнень до елементів матриці А, причому алгебраїчне доповнення до елементу aіj коштує на перетинанні j-й рядка й і-го стовпця, називається приєднаної (чи взаємної) до матриці А. Знайдемо добуток АА* і А*А. Використовуючи відому формулу розкладання визначника по чи рядку стовпцю, а також теорему про суму добутків елементів будь-якого рядка (стовпця) визначника на алгебраїчні доповнення до відповідних елементів іншого рядка (стовпця), і позначаючи через d визначник матриці А,d=|A|,ми одержимо наступні рівності: d 0...00 d...0АА*=А*А=... ... ... . . (3) 0 0... dЗвідси випливає, що якщо матриця А невырожденная, те її присоедененная матриця А* також буде невырожденной, причому визначник d* матриці А* дорівнює (n-1) - й ступеня визначника d матриці А. Справді, переходячи від рівностей (3) до рівності між визначниками, ми одержимоdd*= dn,звідки d?0d*= 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; BeginA. 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; InterfaceConstCTooManySize=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; TypeTOE=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=ObjectCBars,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=RecordmPlus: 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; BeginIF Not Exist Then Begin NotExist; ZFE; Exit; End; IF (Errors<> [0]) Then Begin ZFE; Exit; End; For i: =1 to CLines doFor j: =1 to CBars doSetE(i,j,0); End; Procedure Tabl. Let(Var A); BeginEnd; Procedure Tabl. AllClear; BeginCBars: =0; CLines: =0; SizeInMemory: =0; Errors: = [0] ; M: =Nil; End; Procedure Tabl. DataInit(L,B: Byte); BeginIF 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); BeginIF 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; BeginIF Errors<> [0] Then Exit; IF Not Exist Then Begin NotExist; Exit; End; IF (I>CLines) or (J>CBars) or (I<1) or (J<1) ThenBeginGetE: =0.0; BadPosition; EndElseGetE: =Ar(M^) [((I-1) *CBars+J)] ; End; Procedure Tabl. Del; BeginIF 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; BeginRepeatReadln(F,Prom); IF IOResult<>0 Then Begin ReadError; Close(F); Exit; End; Until (EOF(F)) or (Pos(Search,Prom) <>0); IF Pos(Search,Prom) =0ThenBeginSearchError; Searcher: =False; EndElse Searcher: =True; End; BeginIF 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 doFor J: =1 to CBars doBeginRead(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; BeginIF 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 doBeginFor J: =1 to CBars doBeginWrite(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; BeginErrors: =Errors+ [CTooManySize] ; AnyErrorEnd; Procedure Tabl. BadPosition; BeginErrors: =Errors+ [CBadPosition] ; AnyErrorEnd; Procedure Tabl. FileNotFound; BeginErrors: =Errors+ [CFileNotFound] ; AnyErrorEnd; Procedure Tabl. FileError; BeginErrors: =Errors+ [CFileError] ; AnyErrorEnd; Procedure Tabl. ReadError; BeginErrors: =Errors+ [CReadError] ; AnyErrorEnd; Procedure Tabl. WriteError; BeginErrors: =Errors+ [CWriteError] ; AnyErrorEnd; Procedure Tabl. OutOfData; BeginErrors: =Errors+ [COutOfData] ; AnyErrorEnd; Procedure Tabl. SearchError; BeginErrors: =Errors+ [CSearchError] ; AnyErrorEnd; Procedure Tabl. NotExist; BeginErrors: =Errors+ [CNotExist] ; AnyErrorEnd; Procedure Tabl. ZFE; BeginErrors: =Errors+ [CZFE] ; AnyErrorEnd; Procedure Tabl. UnkNownError; BeginErrors: =Errors+ [CUnkNownError] ; AnyErrorEnd; Procedure Tabl. AnyError; BeginEnd; Constructor TAbl. VMT; BeginExist: =False; End; Procedure Matrix. MSqr; Var i,j: Integer; BeginIF 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 doFor j: =1 to CBars doSetE(i,j,Sqr(A. GetE(i,j))); Self. SelfClear; End; Procedure Matrix. MDg; Var i,j: Integer; BeginIF 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 doFor j: =1 to A. CBars doIF i=j Then SetE(i,j,A. GetE(i,j)) Else SetE(i,j,0); Self. SelfClear; End; Procedure Matrix. BadOperands; BeginErrors: =Errors+ [CBadOperands] ; AnyError; End; Procedure Matrix. MulError; BeginErrors: =Errors+ [CMulError] ; AnyError; End; Procedure Matrix. MDgError; BeginErrors: =Errors+ [CMDgError] ; AnyError; End; Procedure Matrix. SortError; BeginErrors: =Errors+ [CSortError] ; AnyError; End; Procedure Matrix. DetError; BeginErrors: =Errors+ [CDetError] ; AnyError; End; Procedure Matrix. DGaussError; BeginErrors: =Errors+ [CDGaussError] ; AnyError; End; Procedure Matrix. MSqrError; BeginErrors: =Errors+ [CMSqrError] ; AnyError; End; Procedure MAtrix. CuanZeeroError; BeginErrors: =Errors+ [CCuanZeeroError] ; AnyError; End; Procedure MAtrix. SwapError; BeginErrors: =Errors+ [CSwapError] ; AnyError; End; Procedure Matrix. MulToNumError; BeginErrors: =Errors+ [CMulToNumError] ; AnyErrorEnd; Procedure Matrix. DegrError; BeginErrors: =Errors+ [CDegrError] ; AnyErrorEnd; Procedure Matrix. IgError; BeginErrors: =Errors+ [CIgError] ; AnyErrorEnd; Procedure MAtrix. SelfClear; BeginLin: = [0] ; Bar: = [0] ; Plus: =True; Direction: =True; SortLines: =True; BeginZeero: =True; SpecialSort: =False; Chek: =0; Gauss: =False; DetForRev: =False; End; Procedure Matrix. AllClear; Begininherited AllClear; SelfClear; End; Procedure Matrix. Revers; VAr FM: Mem; BeginGauss: =False; InnerRevers(A); End; Procedure Matrix. RevWithGauss; Var FM: Mem; BeginGauss: =True; InnerRevers(A); End; Procedure Matrix. InnerRevers; Var P,A1: Matrix; D: TOE; i,j: Integer; Var Ver: TOE; Var FM: Mem; BeginIF 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 ThenBeginMDegenerate; ReversError; Exit; End; DetForRev: =True; For i: =1 to P. Clines doBeginA. StepRevers; For j: =1 to P. CBars doBeginA1. 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; BeginIF Not Exist Then BEgin NotExist; SwapError; Exit; End; IF (Errors<> [0]) Then Begin SwapError; Exit; End; For i: =1 to CLines doBeginProm: =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; BeginIF Not Exist Then Begin NotExist; CuanZeeroError; Exit; End; IF (Errors<> [0]) Then Begin CuanZeeroError; Exit; End; Sum: =0; IF Not SpecialSortThenFor i: =1 to CLines do IF GetE(i,B1) =0 Then Inc(Sum) elseElseIF BeginZeeroThenBeginSum: =1; While (GetE(Sum,B1) =0) and (Sum<=CLines) do inc(Sum); Dec(Sum); EndElseBeginSum: =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; BeginIF 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; BeginIF Not Exist Then Begin NotExist; CuanZeeroError; Exit; End; IF (Errors<> [0]) Then Begin CuanZeeroError; Exit; End; Sum: =0; IF Not SpecialSortThenFor i: =1 to CBars do IF GetE(L1, i) =0 Then Inc(Sum) elseElseIF BeginZeeroThenBeginSum: =1; While (GetE(L1,Sum) =0) and (Sum<=CBars) do inc(Sum); Dec(Sum); EndElseBeginSum: =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; BeginIF Not Exist Then Begin NotExist; SwapError; Exit; End; IF (Errors<> [0]) Then Begin SwapError; Exit; End; For i: =1 to CBars doBeginProm: =GetE(L1, i); SetE(L1, i,GetE(L2, i)); SetE(L2, i,Prom) End; End; Procedure Matrix. ZeeroSortLines; VAr FM: Mem; BeginIF 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; BeginIF Not Exist Then Begin NotExist; SortError; Exit; End; IF (Errors<> [0]) Then Begin SortError; Exit; End; IF SortLines Then Cuan: =CLinesElse Cuan: =CBars; For i: =1 to Cuan doBeginIF SortLines Then Max: =CuanZeeroInLine(i) Else Max: =CuanZeeroInBar(i); Nmax: =i; For j: =i to Cuan doBeginIF SortLines Then CZ: =CuanZeeroInLine(j) Else CZ: =CuanZeeroInBar(j); IF (CZ<Max) xor DirectionThenBeginMax: =CZ; NMax: =j; End; End; IF i<>NMax ThenBeginIF 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; BeginMax: =S. GetE(1,B1); nMax: =1; For i: =2 to S. Clines doIF Abs(Max) <Abs(S. GetE(i,B1)) ThenBeginMax: =S. GetE(i,B1); nMAx: =i; End; IF S. Clines<>nMAx ThenBeginS. SwapLines(S. Clines,nMAx); Inc(S. Chek); End; End; Procedure AddLines(l1,l2: Integer; K: TOE); Var i: Integer; BeginFor i: =1 to S. CBars doS. SetE(l2, i,(S. GetE(l2, i) - S. GetE(l1, i) *K)); End; Procedure InitObject; Var i,j: Integer; Ver: TOE; BeginSi: =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 doIF not (i in Lin) ThenBeginInc(Si); Sj: =0; For j: =1 to CBars doIF not (j in Bar) ThenBeginInc(sj); Ver: =GetE(i,j); S. SetE(Si,Sj,Ver); EndEnd; End; BeginIF 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 doBeginS. 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 doIF S. GetE(j, i) <>0 ThenBeginK: =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 doP: =P*S. GetE(i, i); DetWithGauss: =P*S. Sign(S. Chek); S. Del; End; Function Matrix. Sign; BeginIF (C div 2) *2=C Then Sign: =1.0 Else Sign: =-1.0; End; Procedure Matrix. SpecialSortLines; VAr FM: Mem; BeginIF 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; BeginIF Not Exist Then Begin NotExist; Exit; End; IF (Errors<> [0]) Then Exit; RemSettings(FM); SpecialSort: =True; SortLines: =False; UniversalSort; RestoreSettings(FM); End; Procedure RemSettings; BeginEnd; Procedure MAtrix. MNotSquare; BeginErrors: =Errors+ [CMNotSquare] ; AnyErrorEnd; Procedure Matrix. AddError; BeginErrors: =Errors+ [CAddError] ; AnyErrorEnd; Procedure Matrix. ReversError; BeginErrors: =Errors+ [CReversError] ; AnyErrorEnd; Procedure Matrix. MDegenerate; BeginErrors: =Errors+ [CMDegenerate] ; AnyErrorEnd; Procedure Matrix. Stopped; BeginErrors: =Errors+ [CStopped] ; AnyErrorEnd; Procedure Matrix. StepRevers; BeginEnd; Procedure Matrix. RemSettings; BeginWith FM doBeginmPlus: = Plus; mDirection: = Direction; mSortLines: = SortLines; mBeginZeero: = BeginZeero; mSpecialSort: = SpecialSort; mGauss: = Gauss; mDetForRev: = DetForRev; EndEnd; Procedure Matrix. RestoreSettings; BeginWith FM doBeginPlus: = 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; BeginMax: =Ar31(S. M^) [1,B1] ; nMax: =1; For i: =2 to S. Clines doIF Abs(Max) <Abs(Ar31(S. M^) [i,B1]) ThenBeginMax: =Ar31(S. M^) [i,B1] ; nMAx: =i; End; IF S. Clines<>nMAx ThenBeginS. SwapLines(S. Clines,nMAx); Inc(S. Chek); End; End; Procedure AddLines(l1,l2: Integer; K: TOE); Var i: Integer; BeginFor i: =1 to S. CBars doBeginAr31(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; BeginS. VMT; S. DataInit(31,31); Si: =0; IF DetForRevThenBeginsi: =31; sj: =31; Ar31(S. M^): =Ar31(M^) EndElseFor i: =1 to CLines doIF not (i in Lin) ThenBeginInc(Si); Sj: =0; For j: =1 to CBars doIF not (j in Bar) ThenBeginInc(sj); Ar31(S. M^) [Si,Sj]: =Ar31(M^) [i,j] ; EndEnd; End; BeginIF 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 doBeginS. 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 doIF Ar31(S. M^) [j, i] <>0 ThenBeginK: =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 doP: =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; BeginIF Not Exist Then BEgin NotExist; SwapError; Exit; End; IF (Errors<> [0]) Then Begin SwapError; Exit; End; For i: =1 to CBars doBeginProm: =Ar31(M^) [L1, i] ; Ar31(M^) [L1, i]: =Ar31(M^) [L2, i] ; Ar31(M^) [L2, i]: =PromEnd; 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; BeginMax: =Ar63(S. M^) [1,B1] ; nMax: =1; For i: =2 to S. Clines doIF Abs(Max) <Abs(Ar63(S. M^) [i,B1]) ThenBeginMax: =Ar63(S. M^) [i,B1] ; nMAx: =i; End; IF S. Clines<>nMAx ThenBeginS. SwapLines(S. Clines,nMAx); Inc(S. Chek); End; End; Procedure AddLines(l1,l2: Integer; K: TOE); Var i: Integer; BeginFor i: =1 to S. CBars doBeginAr63(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; BeginS. VMT; S. DataInit(63,63); Si: =0; IF DetForRevThenBeginsi: =63; sj: =63; Ar63(S. M^): =Ar63(M^) EndElseFor i: =1 to CLines doIF not (i in Lin) ThenBeginInc(Si); Sj: =0; For j: =1 to CBars doIF not (j in Bar) ThenBeginInc(sj); Ar63(S. M^) [Si,Sj]: =Ar63(M^) [i,j] ; EndEnd; End; BeginIF 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 doBeginS. 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 doIF Ar63(S. M^) [j, i] <>0 ThenBeginK: =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 doP: =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; BeginFor i: =1 to CBars doBeginProm: =Ar63(M^) [L1, i] ; Ar63(M^) [L1, i]: =Ar63(M^) [L2, i] ; Ar63(M^) [L2, i]: =PromEnd; End; END. Контрольні прикладиДана матриця: 3 - 1 0А= - 2 1 12 - 1 4Відповідь: 1 0,8 - 0,2А-1 = 2 2,4 - 0,60 0,2 0,2Список використаної літератури1. А.Г. Курош "курс высшей алгебры", "наука", Москва 1975.2. С.Т. Завало, В.М. Костарчук, Б.И. Хацет "алгебра и теория чисел", Том 1,"высшая школа", Киев 1974.3. С.Т. Завало, В.М. Костарчук, Б.И. Хацет "алгебра и теория чисел", Том 2,"высшая школа", Киев 1976.
|
|