на основе примера http://mathem.h1.ru/examples/example.html?3
Функции работы с матрицами
Const maxCount=30; type TArrayReal=array[0..maxCount, 0..maxCount] of real; var Count:integer;
{функция расчета обратной матрицы } procedure GetBackMatrix(source:TArrayReal;var Back:TArrayReal); var k, i, j: integer; begin for i:=0 to Count - 1 do for j:=0 to Count - 1 do Back[i,j]:=source[i,j];
for k:=0 to Count - 1 do begin for i:=0 to Count - 1 do for j:=0 to Count - 1 do begin if (i=k) and (j=k) then source[i,j] := 1/Back[i,j]; if (i=k) and (j<>k) then source[i,j] := -Back[i,j]/Back[k,k]; if (i<>k) and (j=k) then source[i,j] := Back[i,k]/Back[k,k];
if (i<>k) and (j<>k) then source[i,j] := Back[i,j] - Back[k,j] * Back[i,k]/Back[k,k]; end; for i:= 0 to Count - 1 do for j:= 0 to Count - 1 do Back[i, j]:= source[i, j]; end; end;
Function del(A:TArrayReal; l:integer; m:integer):TArrayReal; {результат этой функции - массив, который представляет собой массив А с удаленным первым столбцом и L-той строкой, размером m*m} Var j,g:integer; begin For g:=l to m-1 do {сдвигаем все элементы матрицы на элемент выше, начиная с l+1-ого. Этим самым мы удаляем L-тую строку} For j:=0 to m do A[g,j]:=A[g+1,j]; For g:=0 to m-1 do {аналогично удаляем первый столбец, сдвигая все элементы матрицы на одну ячейку влево} For j:=0 to m-1 do A[g,j]:=A[g,j+1]; Result:=A; end; Function od(i:integer):integer; {функция вычисляет значение (-1)^i} begin if ((i+1) mod 2)=0 then Result:=1 else Result:=-1; end;
рекурсивное вычисление детерминанта матрицы. А - матрица, m - ее размер}
Function det(A:TArrayReal; m:integer):Real; { Var i:integer; buf:real; begin buf:=0; if m=0 then buf:=A[0,0] {тривиальное решение, с помощью которого функция выходит из рекурсии} else For i:=0 to m do {цикл разлагает определитель матрицы на сумму произведений всех элементов первого столбца на их алгебраические дополнения. Для справки: алгебраическим дополнением элемента определителя называется соответствующий ему минор, взятый со знаком (-1)^i+j, где i+j - сумма номеров строки и столбца, на пересечении которых стоит данный элемент} begin buf:=buf+od(i+1)*A[i,0]*det(del(A,i,m),m-1); {переходим к вычислению определителя меньшего размера до тех пор, пока не придем к тривиальному решению} end; Result:=buf; end;
|