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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2014, 15:34   #1
sda1005
 
Регистрация: 24.11.2014
Сообщений: 5
По умолчанию Помогите найти ошибку в нахождение определителя

Доброе время суток всем. Помогите найти ошибку в нахождение определителя. Сам определитель находится верно, но знак иногда не совпадает. Закономерность выдачи неправильного знака (+/-) так и не удалось выявить. Надеюсь на вашу помощь.
Код:
procedure TForm1.btn1Click(Sender: TObject);
  var
    k,j:Integer;
    a:Tmatrix;
    det:Real;
procedure  Per (k,n:Integer; var a:Tmatrix; var p:Integer);
 var
   z:Real;
   i,j:Integer;
  begin
    z:=Abs(a[k,k]);           // значение матрицы без учета знака - и +
    i:=k;                     // присваиваем номер строки и столбца
    p:=0;                     //счетчик перестановок
      for j:=k+1 to n-1 do
        begin
          if Abs (a[j,k])>z then
            begin
              z:=Abs(a[j,k]);
              i:=j;
              p:=p+1;
            end;
        end;

      if i>k then
        for j:=k to n-1 do
          begin
            z:=a[i,j];
            a[i,j]:=a[k,j];
            a[k,j]:=z;
          end;
  end;

 function  Znak (p:Integer):Integer;
  begin
    if p mod 2 =0 then
      Result:=1
    else result :=-1;
  end;

  procedure  Opr(n:Integer; var a:Tmatrix; var det:Real);
  var
    k,i,j,p:Integer;
    r:Real;
      begin
        det:=1.0;
          for k:=0 to n-1 do
            begin
              if a[k,k]= 0 then Per(k,n,a,p);        //   перестан строк
              det:=Znak(p)*det*a[k,k];               //   вычислен определителя
              for j:=k+1 to n-1 do                    //   пересчет коэфицентов
                begin
                  r:=a[j,k]/a[k,k];
                    for i:=k to n-1 do
                    a[j,i]:=a[j,i]-r*a[k,i];
                end;
            end;
      end;

begin
 n:=5;                                               //!!!!!!!!!!!!!!!!!!!размер массива!!!!!!!!!!!
  SetLength(a,n,n);
  for k:=0 to n-1 do
  for j:=0  to n-1 do
      a[k,j]:=StrToFloat( Form1.StringGrid2.Cells[j,k] );
    Opr(n,a,det);
 Form1.edt6.Text:=FloatToStr(det);
end;

Последний раз редактировалось Stilet; 24.11.2014 в 17:25.
sda1005 вне форума Ответить с цитированием
Старый 26.11.2014, 11:17   #2
sda1005
 
Регистрация: 24.11.2014
Сообщений: 5
По умолчанию

Если в первую сроку, первой ячейки присвоить значение "0" то ответ будет с ошибочным знаком, хотя само значение правильно. Следовательно ошибка где то в procedure Per или function Znak. Где именно что то не могу понять совсем ((
sda1005 вне форума Ответить с цитированием
Старый 26.11.2014, 11:45   #3
Вадим Мошев

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

Сам код не смотрел и не вникал в него. У вас в коде переставляются строки местами.

Есть такое правило: "Если в квадратной матрице поменять местами две любые строки/столбцы", то знак определителя изменится на противоположный".
Отсюда следствие, что если число таких перестановок будет чётным, то определитель не изменится, если нечётный, то он будет противоположным по знаку.

видать, у вас как раз происходит нечётное количество перестановок строк, если отталкиваться от комментария "Счётчик перестановок".

Последний раз редактировалось Вадим Мошев; 26.11.2014 в 11:47.
Вадим Мошев вне форума Ответить с цитированием
Старый 26.11.2014, 11:50   #4
sda1005
 
Регистрация: 24.11.2014
Сообщений: 5
По умолчанию Уважаемый Вадим

Уважаемый Вадим про смену знака при четном количестве перестановок я знаю. Вот участок кода который за это отвечает

Код:
 function  Znak (p:Integer):Integer;
  begin
    if p mod 2 =0 then
      Result:=1
    else result :=-1;
  end;
Ошибка в знаке получается когда водной строке два нуля подряд идут.

Последний раз редактировалось ACE Valery; 26.11.2014 в 18:15.
sda1005 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HEEELP! Программирование в MathCad. Нахождение определителя квадратной матрицы. kotyasha Помощь студентам 0 17.10.2012 20:50
нахождение определителя методом Гаусса (VBA) meigas Microsoft Office Excel 0 29.05.2012 19:36
нахождение определителя методом Гаусса (VBA) meigas Помощь студентам 0 29.05.2012 17:19
Нахождение определителя матрицы La`Fleur C++ Builder 0 10.05.2011 22:34
Нахождение определителя dyusha2006 Помощь студентам 0 23.11.2010 21:18