Пытаюсь написать программу на Дельфи для вычисления определителя матрицы произвольного размера. Вот основная процедура:
procedure TForm1.Button1Click(Sender: TObject);//приводим матрицу к Гауссовому ступенчатому виду, находим определитель как определитель верхне-треугольной матрицы (перемножаем элементы на диагонали)
var B, Det: real;//B -- буферная переменная, Det -- определитель
k, S: byte;//счётчики и индексы
x: boolean;
begin
Setlength(M, n, n);
S:=0;
for i:=0 to n1 do for j:=0 to n1 do M[i, j]:=strtofloat(StringGrid1.Cells[j, i]);//заполняем матрицу со StringGrid
for i:=0 to n1 do begin
x:=true;
for j:=0 to n1 do if ((M[i, j]<>0) and x) then begin
for k:=0 to n1 do begin//меняем местами i-тую строчку и j-тую строчку
B:=M[i, k];
M[i, k]:=M[j, k];
M[j, k]:=B;
end;
S:=S+1;//счётчик того, сколько раз поменяли местами строчки
x:=false;//ограничитель смены строчек -- меняем каждую строчку только один раз
end;
end;//теперь по диагонали точно стоят ненулевые элементы, в S заложено количество смен местами строчек
x:=false;
for i:=0 to n1 do if M[i, i]=0 then x:=true;
if x then Det:=0
else begin
Det:=1;
//for i:=0 to (n1-1) do for j:=(i+1) to n1 do for k:=0 to n1 do M[j, k]:=M[j, k]-M[i, k]*M[j, i]/M[i, i];//алгоритм Гаусса (не работает!)
for i:=0 to n1 do Det:=Det*M[i, i];
if (S mod 2 = 1) then Det:=0-Det;
end;
label1.caption:=floattostr(Det);
end;
Где ошибка? Не надо писать какая именно ошибка, напишите просто в какой строчке, я хочу сам её отыскать.
Алгоритм следующий: сначала я перемешиваю строчки так, чтобы все нули оказались слева снизу от главной диагонали, затем использую алгоритм Гаусса.
Перемещение строчек вроде происходит нормально, однако занулять их программа не хочет. Ошибку в формуле искал, не нашёл.
Примечание:
n1 -- это n-1, просто в динамических массивах нумерация от 0 идёт
Примечание:
C++ не владею, ибо студент, а не профессиональный программист.
Примечание:
Если кто делал через минорное разложение, буду рад прочитать принцип. Как я понял, там надо или вводить функцию символа Леви-Чивиты для произвольной размерности, или зацикливать циклы (делать столько циклов, сколько размерность).
Примечание:
Спасибо, но не надо. Кроме Паскаля я ни в чем не разбираюсь.
Примечание:
Обнаружил ошибку в алгоритме замены. Пока не поправлю, вопрос смысла не имеет.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.