Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2013, 21:09   #1
Rok_k
 
Регистрация: 29.05.2010
Сообщений: 4
Вопрос Какая формула описана кодом

Доброго времени суток, уважаемые форумчане. Столкнулся с непониманием работы кода. Код призван преобразовать матрицу к виду обратной матрицы. Но не прослежу даже где вычисляется детерминант (насколько я знаю, преобразование невозможно, без нахождения детерминанта)..и вообще, как из этого получается обратная матрица, и где вычисляется определитель? код:

Код:
 Result := -1;
  SetLength(A, ArraySize, ArraySize * 2);
  SetLength(Temp, 1, ArraySize * 2);
  for i := 0 to ArraySize - 1 do
  begin
    for j := 0 to ArraySize - 1 do { Создаём матрицу вида [A|E] }
      A[i, j] := Matrix[i, j];
    for j := ArraySize to ArraySize * 2 - 1 do
      A[i, j] := Ord(i = (j - ArraySize)); // Диагональные равны 1
  end;
  { Начало преобразования к виду [E|B] }
  { Поиск нулевых строк и столбцов в матрице }
  for i := 0 to ArraySize - 1 do
  begin
    for j := i to ArraySize - 1 do
    begin
      Rows := 0;
      Cols := 0;
      for k := i to ArraySize - 1 do
      begin
        Rows := Rows + Ord(A[j, k] = 0);
        Cols := Cols + Ord(A[k, j] = 0);
      end;
      if Rows + Cols = 0 then
        Break;
      if (Cols = ArraySize - i) or (Rows = ArraySize - i) then
        Exit;
    end;

    if A[i, i] = 0 then
      for j := i + 1 to ArraySize - 1 do
        if A[j, i] <> 0 then
        begin
          Temp[0] := A[i]; { меняем строку  на строку с }
          A[i] := A[j]; { первым ненулевым элементом }
          A[j] := Temp[0];
          Break
        end;

    for j := 0 to i - 1 do { * преобразование }
      if A[j, i] <> 0 then
      begin
        for k := i + 1 to 2 * ArraySize - 1 do
          A[j, k] := A[j, k] - A[i, k] * A[j, i] / A[i, i];
        A[j, i] := 0
      end;
    for j := i + 1 to ArraySize - 1 do
      if A[j, i] <> 0 then
      begin
        for k := i + 1 to 2 * ArraySize - 1 do
          A[j, k] := A[j, k] - A[i, k] * A[j, i] / A[i, i];
        A[j, i] := 0
      end;
  end; { Конец преобразования }

  // Забираем значение обратной матрицы
  for i := 0 to ArraySize - 1 do
    for j := 0 to ArraySize - 1 do begin
      Matrix[i, j] := A[i, j + ArraySize] / A[i, i];
      opr:=A[i, i];
    end;
     Result := 1;
end;
Rok_k вне форума Ответить с цитированием
Старый 03.02.2013, 21:47   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Но не прослежу даже где вычисляется детерминант (насколько я знаю, преобразование невозможно, без нахождения детерминанта)..
Смотря какое преобразование выбрано. Значение детерминанта на самом деле показывает, вырожденна матрица или нет. Обратная матрица может существовать только при det A>0.

В методе Гаусса-Жордана определитель используется. А вот в методе элементарных преобразований - нет. Там просто справа приписывается единичная матрица и проводятся преобразования, пока такая же единичная не будет слева (вместо исходной). Справа тогда как раз и будет обратная исходной матрица.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 04.02.2013, 01:13   #3
Rok_k
 
Регистрация: 29.05.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
А вот в методе элементарных преобразований - нет.
Спасибо Вам огромное!!) Именно метод элементарных преобразований и описан. А я его и не знал((... Потому - и не понял кода. Изучил метод - код теперь читается.
Rok_k вне форума Ответить с цитированием
Старый 04.02.2013, 11:26   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Sciv
Цитата:
Смотря какое преобразование выбрано. Значение детерминанта на самом деле показывает, вырождена матрица или нет. Обратная матрица может существовать только при det A>0.
Нет. Она может существовать тогда и только тогда, когда детерминант не равен нулю
Вадим Мошев вне форума Ответить с цитированием
Старый 04.02.2013, 11:35   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Нет. Она может существовать тогда и только тогда, когда детерминант не равен нулю
Пардон, ты прав, конечно же не равен. Собственно, сама теорема так и звучит:

"Для того, чтобы существовала матрица, обратная данной, необходимо и достаточно, чтобы ее детерминант был отличен от нуля".

Кроме того, это логически следует из вырожденности матрицы: раз матрица имеет только два состояния, то соответственно, и определяются эти состояния двумя положениями детерминанта - либо ноль, либо не ноль (а по другому никак )

Спасибо, что поправил
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
какая формула в целевой ячейке? extrayellow Microsoft Office Excel 1 02.12.2012 23:01
какая формула подойдет kachorro Microsoft Office Excel 3 25.04.2012 13:02
Не могу понять, какая нужна формула. Анна67 Помощь студентам 1 21.11.2011 14:01
КАКАЯ ФОРМУЛА НУЖНА ??? Anvar_al_khalid Microsoft Office Excel 3 20.12.2009 17:21
Учет оплаты. Какая формула будет если..? Anton_audit Microsoft Office Excel 5 12.08.2009 17:40