Когда-то давно писал я что-то подобное на Паскале, теперь вот хочу написать
на Delphi
Но, к сожалению, начисто забыл алгоритм- мат. модель помню, а как это
объяснить машине что-то никак не припомню. Помогите, pls, кто еще помнит что
такое определитель.
С Уважением,
Денис Михайлов.
> Но, к сожалению, начисто забыл алгоритм- мат. модель помню, а как это
> объяснить машине что-то никак не припомню.
Проще всего посчитать определитель следующим путем:
1) Привести матрицу к треугольному виду (методом Гаусса)
2) Перемножить все элементы на главной диагонале - это и есть определитель
матрицы.
Олег.
Когда-то давно мой друг писал такое на паскале в домашней работе по
информатике. И восторгался тем, что матрицы произвольного порядка
замечательно грохаются в рекурсии. Есть какое-то правило (наверняка в любом
справочнике по математике), согласно которому определитель матрицы равен
определителю... блин как сказать-то не знаю ;)
Короче, есть у тебя матрица 4х4, представляем ее в виде 4х матриц 2х2, у
матриц 2х2 находим определители, получается новая матрица 2х2, составленная
из этих определителей. Ее определитель равен определителю исходной матрицы.
Hе бейте меня сильно, если напутал ;)
Иван Щенников pазговаpивал с All :
ИЩ> есть у тебя матрица 4х4, представляем ее в виде 4х матриц 2х2, у
ИЩ> матриц 2х2 находим определители, получается новая матрица 2х2,
ИЩ> составленная из этих определителей. Ее определитель равен определителю
ИЩ> исходной матрицы. Hе бейте меня сильно, если напутал ;)
А если матрица 3х3? А если матрица 17х17?
А если это бесконечно большое простое число, которое не делится на 2?
Hе в этом дело.
Мат. алгоритм таков:
Сумма диагональных перемноженных элементов слева верха до права низа минус
сумма диагональных перемноженных элементов справа верха до лева низа.
Предусмотреть чтобы индекс при вылезании за пределы становился сначала. И все.
Hикаких тебе новых определителей.
Делается при помощи пары циклов и массива размерностью равной порядку матрицы.
До встречи,
Влад.
email: kw...@belgtts.ru ICQ#: 12511738 ... When you kill one - it's a tragedy.
When you kill 1000000 - it's a statistic.
> Мат. алгоритм таков:
> Сумма диагональных перемноженных элементов слева верха до права низа минус
> сумма диагональных перемноженных элементов справа верха до лева низа.
> Предусмотреть чтобы индекс при вылезании за пределы становился сначала. И
все.
> Hикаких тебе новых определителей.
> Делается при помощи пары циклов и массива размерностью равной порядку
матрицы.
Двойка, Вам, юноша.
Определителем n-го порядка матрицы называется сумма n! членов,
составленная следующим образом:
членами служат всевозможные произведения n элементов матрицы,
взятых по одному в каждой строке и в каждом столбце,
причем член берется со знаком плюс, если его индексы
составляют четную подстановку, и со знаком минус -
в противоположном случае.
Вот так.
Понятно, что пользоваться этим определением для сабжа
достаточно проблематично, поэтому на практике можно
поступить следующим образом (при условии, что матрица
невырождена!!).
Привести исходную матрицу к треугольному (или диагональному)
виду. Тогда произведение диагональных элементов полученной матрицы,
умноженное на (-1)^k, где k - количество перестановок
строк или столбцов при преобразовании матрицы, составит
искомое значение определителя.
Это общая схема алгоритма. Конечно, при реализации
возможны нюансы, связанные, например,
с обусловленностью матрицы и т.п.
Подробнее об этом - в учебниках по численным методам линейной алгебры.
С уважением, Владимир Антоник
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
В давние времена довелось писать библиотеку для работы с матрицами. Вот
оттуда функция расчета определителя, думаю разберешся.
function TMatrix.Det:extended;
var Size,C,R:integer; K:extended; Check:boolean;
begin
if fCols <> fRows then begin Result:=0.0; Exit end;
Result:=1.0; Size:=fCols;
while Size > 1 do begin
if abs(M[Size-1,Size-1]) <= 1e-100 then begin
Check:=false;
for R:=0 to Size-2 do if abs(M[Size-1,R]) > 1e-100 then begin
Check:=true; for C:=0 to Size-1 do M[C,Size-1]:=M[C,Size-1]+M[C,R]
end;
if not Check then begin Result:=0.0; Break end
end;
for R:=0 to Size-2 do begin
K:=-M[Size-1,R]/M[Size-1,Size-1];
for C:=0 to Size-1 do M[C,R]:=M[C,R]+K*M[C,Size-1]
end;
Result:=Result*M[Size-1,Size-1]; Dec(Size)
end;
Result:=Result*M[0,0]
end;
Если что не совсем понятно или еще что по матрицам нужно - пиши мылом.
Дмитрий Лаушкин