Определитель любого порядка

Если порядок определителя выше трех, то определитель преобразовывают к треугольному виду : выше или ниже диагонали стоят нули. А затем перемножают элементы диагонали и в результате получается значение определителя.
 uses crt;
 {label 1,2;}
 const
 n=4;{число строк, число столбцов; можно изменить}
 type
 vector = array[1..n] of real;
 matrica= array[1..n] of vector;

 var
 a: matrica;
 i,j : integer;
 det : real; {определитель матрицы}
 procedure wywod;
 {Вывод матрицы}
 var i,j:integer;
 begin
 for i:=1 to n do
 begin
 for j:=1 to n do
 write (a[i,j]:9:2,' ');
 writeln
 end;
 end;{wywod}
 procedure movestrings(k,l:integer; var a: matrica; n:integer);
 {Процедура перестановки k-ой и l-ой строк в матрице а порядка n}
 var j : integer;
 r : real;
 begin
 if (k<=n) and (l<=n)then
 begin
 for j := 1 to n do
 begin
 r := a[l,j];
 a[l,j] :=a[k,j];
 a[k,j] := r;
 end;
 end
 end; {movestrings}
 procedure prhod(var a:matrica; n : integer; var det: real);
 {Преобразование матрицы а, размерности n и вычисление определителя det -
 соответствует "прямому ходу" метода Гаусса}
 var i,j,k,l : integer;
 b : matrica;
 k1,k2,d:real;
 begin
 d:=1;
 for k := 1 to n-1 do
 begin
 {Если ведущий элемент ненулевой}
 if a[k,k]<>0 then
 k1:=a[k,k]
 else
 {В противном случае: перестановка строк,...}
 begin
 l:=k;
 repeat
 l:=l+1
 {ищем первый ненулевой элемент данного столбца,
 стоящий ниже диагонального,...}
 until (a[l,k]<>0) or (l=n+1);
 {если такой элемент найден,... }
 if l<=n then
 begin
 {...меняем строки местами,...}
 movestrings(k,l,a,n);
 {...определитедь умножается на -1,...}
 d:=d*(-1);
 {...определение значения ведущего элемента - k1,...}
 k1:=a[k,k];
 {(для пошаговго вывода преобразований прямого хода
 снимите комментарий у следующих двух операторов)}
 write('Преобразование ',k);readln;wywod;
 end
 else
 {В противном случае такой элемент отсутствует,
 что означает, что определитель системы равен нулю}
 begin
 det:=0;
 {выход из процедуры}
 exit;
 end;
 end;
 if d<>0 then
 {Вычитание из каждой i-ой строки, лежащей ниже k-ой,...}
 for i := k+1 to n do
 begin
 k2:=a[i,k];
 {...вычитание k-ой строки, умноженной на коэффициент}
 for j := k to n+1 do
 a[i,j] := a[i,j]-a[k,j]*k2/k1;
 end;{цикл по i}
 d:=d*a[k,k]; readln;wywod; writeln('d=',d:5:2);
 end;{цикл по k}
 det:=d*a[n,n];
 {Определитель системы равен произведению диагональных элементов}
 end;{prhod}
Begin
 clrscr;
 {Исходная матрица - тестовый пример}
 a[1,1] := 0; a[1,2] :=0; a[1,3] :=0; a[1,4]:=2;
 a[2,1] := 7; a[2,2] :=2; a[2,3] :=0; a[2,4]:=1;
 a[3,1] := 14; a[3,2] :=14; a[3,3] := 0; a[3,4]:=11;
 a[4,1] := 0; a[4,2] :=0; a[4,3] :=1; a[4,4]:=1;
 {Исходная матрица}
 wywod;
 {Преобразование матрицы - "прямой ход" метода Гаусса}
 prhod(a,n,det);
 {Вывод преобразованной матрицы}
 writeln('Матрица после преобразований');wywod;
 write('Определитель равен ',det:7:3); readln;
End.
Онлайн всего: 13
Гостей: 13
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте