egin
// Якщо нічого не допомогло
flag: = false;
Break;
end;
// Обнулення всіх матриць
Zero (M); Zero (Mob); Zero (bac);
// Побудова матриць М
for j: = 0 to Length (a [i]) -1 do
begin
Mob [j, j]: = 1;
Mob [i, j]: = a [i +1, j];
M [j, j]: = 1;
M [i, j]: =-Mob [i, j]/a [i +1, i];
if i = j then M [i, j]: = 1/a [i +1, i];
end;
// Множення матриці А на М
Multiple (a, M, bac);// A * M
Multiple (Mob, bac, a);// M ^ (-1) * (A * M)
END;
// Обробка випадку 2.2, якщо треба
if not flag then
begin
M: = nil;
Mob: = nil;
// Знаходимо матрицю С і виводимо її коефіцієнти
SetLength (bac, 1, length (a)-i-1);
for j: = i +1 to length (a) -1 do bac [0, j-i-1]: = a [i, j];// Матриця C
Result: = '(' + FloatToStrF (bac [0,0], ffFixed, 10,3);
for i: = 1 to Length (bac) -1 do
Result: = Result + ',' + FloatToStrF (bac [0, i], ffFixed, 10,3);
Result: = Result + '),';
// "Урізуємо" матрицю А до стану B, см. 2.2 пункт алгоритму
SetLength (a, i +1, i +1);
// Викликаємо рекурсивно процедуру
Result: = Result + FindDet (a);
end
else begin
Result: = '(' + FloatToStrF (a [0,0], ffFixed, 10,3);
for i: = 1 to Length (a) -1 do
Result: = Result + ',' + FloatToStrF (a [0, i], ffFixed, 10,3);
Result: = Result + ')';
end;
bac: = nil;
end;
procedure TForm1.bbPlusClick (Sender: TObject);
begin
sgInData.ColCount: = sgInData.ColCount +1;
sgInData.RowCount: = sgInData.RowCount +1;
if sgInData.ColCount = 11 then ShowMessage ('Attention! Отримані результати мають малу точність');
end;
procedure TForm1.bbMinusClick (Sender: TObject);
begin
if sgInData.ColCount <3 then Exit;
sgInData.ColCount: = sgInData.ColCount-1;
sgInData.RowCount: = sgInData.RowCount-1;
end;
procedure TForm1.bbOpenClick (Sender: TObject);
Var k: real;
f: textfile;
a, i, j: integer;
begin
OpenDialog1.Filter: = 'Всі файли (*. *) | *. * | Файли. Txt (*. Txt) | *. TXT ';
OpenDialog1.Title: = 'Вибір файлу для цієї проги ';
OpenDialog1.FilterIndex: = 2;
if OpenDialog1.Execute then
begin
AssignFile (f, OpenDialog1.FileName);
Reset (f);
end
else Exit;
ReadLn (f, a);
sgInData.ColCount: = a;
sgIndata.RowCount: = a;
for i: = 0 to a-1 do
begin
for j: = 0 to a-1 do
begin
Read (f, k);
sgIndata.Cells [j, i]: = FloattoStr (k);
end;
ReadLn (f);
end;
CloseFile (f);
end;
procedure TForm1.bbFindClick (Sender: TObject);
Var a: matrix;
i, j: integer;
begin
try
SetLength (a, sgInData.ColCount, sgInData.RowCount);
for i: = 0 to sgInData.RowCount-1 do
for j: = 0 to sgInData.RowCount-1 do a [i, j]: = StrToFloat (sgInData.Cells [j, i]);
except
begin
a: = nil;
ShowMessage ('STOP! Неправильний введення, перевірте вхідні дані ');
Exit;
end;
end;
OutData.Clear;
OutData.Lines.Add ('Коефіцієнти характеристичного рівняння ');
OutData.Lines.Add (FindDet (a));
a: = nil;
end;
procedure TForm1.Multiple (a, b: Matrix; var rez: Matrix);
var i, k, j: word;
Begin
for i: = 0 to Length (a [1]) -1 do
for k: = 0 to Length (a [1]) -1 do
begin
// Оновлення зайнятих матриць
rez [i, k]: = 0;
for j: = 0 to Length (a [1]) -1 do rez [i, k]: = rez [i, k] + a [i, j] * b [j, k];
end;
end;
function TForm1.Remove (var rez: Matrix; i: integer): boolean;
Var j, k: integer;
E, bac: Matrix;
begin
Result: = false;
for k: = 0 to i-1 do// Шукаємо ненульовий елемент ліворуч
if rez [i +1, k] <> 0 then
begin
Result: = true;
Break;
end;
if not Result then Exit;
SetLength (E, Length (rez [1]), Length (rez [1]));
SetLength (bac, Length (rez [1]), Length (rez [1]));
for j: = 0 to Length (rez [1]) -1 do E [j, j]: = 1;
for j: = 0 to Length (rez [1]) -1 do
begin
// Міняємо два рядки місцями в матриці E
E [i, j]: =-E [i, j]-E [k, j];
E [k, j]: =-E [i, j]-E [k, j];
E [i, j]: =-E [i, j]-E [k, j];
end;
Multiple (rez, E, bac);// A * M
Multiple (E, bac, rez);// M ^ ...