Приветствую Вас Гость | RSS

Delphi заготовки

Вторник, 26.11.2024, 23:37
Главная » 2012 » Май » 29 » Функции работы с матрицами Pascal / Delphi Нахождение определителя и обратной матрицы
13:41
Функции работы с матрицами Pascal / Delphi Нахождение определителя и обратной матрицы
на основе примера
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;

Просмотров: 8083 | Добавил: NetSoftWare | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: