определитель матрицы n-ного порядка в делфи

Железо, софт, сети, программирование, ремонт, настройка и обслуживание.

#1  Krox » Чт 26.06.2008, 22:21

кто может помочь с написанием онного алгоритма любым методом на делфи?

буду благодарен)
у меня есть инвайты на tfile.ru - в личку. только что зарегистрировавшимся не отсылаю
http://mg.irkutsk.ru - сайт Иркутского Городского отделения Молодой Гвардии
Всё, что меня не убивает, делает меня сильнее
Аватара пользователя
Krox
постоялец
 
Сообщения: 770
Зарегистрирован: Вс 16.07.2006, 2:02
Откуда: Иркутск

#2  Vadya corp. » Чт 26.06.2008, 23:29

Так найди просто формулу для подсчета определителя и реализуй алгоритм, там он очень просто делается
Если хотите пофотаться бесплатно, то пишите в личку
Аватара пользователя
Vadya corp.
постоялец
 
Сообщения: 1136
Зарегистрирован: Пт 26.05.2006, 20:02
Откуда: Иркутск

#3  Iver » Чт 26.06.2008, 23:33

Видел где-то алгоритм решения линейных уравнений, там как раз для этого матрицу считает, не помню уже как там и чего, вот только суть там сведения энтой n-ой матрицы к матрице второго порядка, а дальше крестиком как в школе. В нете полно решений и на делфи найдется, хотя с басика того же перевести на него тривиальная задача.
Аватара пользователя
Iver
постоялец
 
Сообщения: 171
Зарегистрирован: Чт 21.06.2007, 15:16
Откуда: не указан

#4  Vadya corp. » Чт 26.06.2008, 23:51

Iver переводом к матрице второго порядка %) Ибануцо
http://ru.wikipedia.org/wiki/Определитель - тут формула есть
Если хотите пофотаться бесплатно, то пишите в личку
Аватара пользователя
Vadya corp.
постоялец
 
Сообщения: 1136
Зарегистрирован: Пт 26.05.2006, 20:02
Откуда: Иркутск

#5  Phoenix » Чт 26.06.2008, 23:58

Krox товарищ вы редкостный лентяй. Сам искал как-то по этой теме - в нете исходников гора!
Злой железячник.
Изображение
Аватара пользователя
Phoenix
постоялец
 
Сообщения: 2234
Зарегистрирован: Вт 10.01.2006, 5:29
Откуда: Новосибирск/Иркутск

#6  Iver » Пт 27.06.2008, 0:00

Vadya corp. , перевод осуществляется в цикле, никуя там ни ибануцо, компактный рациональный алгоритм, а по этой формуле только ручками решать (ипо заипешся перестановки считать), можно конечто и так но это же лажа полная, когда речь идет о n-ом порядке, все равно что метод "вычеркивания" организовать. ИМХА
Аватара пользователя
Iver
постоялец
 
Сообщения: 171
Зарегистрирован: Чт 21.06.2007, 15:16
Откуда: не указан

#7  Krox » Пт 27.06.2008, 0:26

вадя, там реально с перестановками геммор)
эта задача есть на курсовик.ком но 520р на ветер слишком уж шикарно выкидывать)
вторую неделю сонный хожу(
щас нашёл на паскале... работает... но тест проходит на матрице 2х2
Код: Выделить всё
uses
crt;

const
n = 2;

type
vector = array [1..32] of real;
matrix = array [1..32] of vector;

var
a: matrix;
b, c: vector;
i, j: byte;
p: boolean;
res: real;

procedure Determinant (x: matrix; size: byte; var Result: real);
var
y: vector;
i, j, k: byte;
p: real;
begin
Result := 0;
for i := 1 to size do y[i] := 1;
for i := 1 to pred (n) do begin
if x[i, i] = 0 then begin
k := succ (i);
while (k <= size) and (x[k, i] = 0) do inc (k);
if x[k, i] = 0 then exit;
p := y[i]; y[i] := y[k]; y[k] := p; y[i] := -y[i];
for j := i to size do begin
p := x[i, j]; x[i, j] := x[k, j]; x[k, j] := p;
end;
end;
p := x[i, i]; y[i] := y[i] * p;
for j := i to size do x[i, j] := x[i, j] / p;
for k := succ (i) to size do begin
p := x[k, i];
for j := i to size do x[k, j] := x[k, j] - p * x[i, j];
end;
end;
Result := x[size, size];
for i := 1 to pred (size) do Result := Result * y[i];
end;

procedure Gauss (x: matrix; y: vector; size: byte; var Result: vector; var isResult: boolean);
var
i, j, k: byte;
p: real;
begin
isResult := False;
for i := 1 to size do Result[i] := 0;
for i := 1 to pred (n) do begin
if x[i, i] = 0 then begin
k := succ (i);
while (k <= size) and (x[k, i] = 0) do inc (k);
if x[k, i] <> 0 then begin
p := y[i]; y[i] := y[k]; y[k] := p;
for j := i to size do begin
p := x[i, j]; x[i, j] := x[k, j]; x[k, j] := p;
end;
end;
end;
if x[i, i] <> 0 then begin
p := x[i, i]; y[i] := y[i] / p;
for j := i to size do x[i, j] := x[i, j] / p;
for k := succ (i) to size do begin
p := x[k, i]; y[k] := y[k] - p * y[i];
for j := i to size do x[k, j] := x[k, j] - p * x[i, j];
end;
end;
end;
if (x[size, size] = 0) and (y[size] <> 0) then exit;
if x[size, size] = 0 then Result[size] := 0
else Result[size] := y[size] / x[size, size];
for i := pred (size) downto 1 do begin
Result[i] := y[i];
for j := succ (i) to size do
Result[i] := Result[i] - x[i, j] * Result[j];
end;
isResult := True;
end;

begin
clrscr;
randomize;
writeln ('start matrix:');
for i := 1 to n do begin
for j := 1 to n do begin
a[i, j] := random(10);
write (a[i, j]:8:2);
end;
b[i] := random(10);
writeln (' | ', b[i]:8:2);
end;
Determinant (a, n, res);
writeln ('determinant = ', res:8:2);
Gauss (a, b, n, c, p);
if not p then writeln ('net reshenija') else begin
for i := 1 to n do writeln ('x[', i:2, '] = ', c[i]:8:2);
end;
readkey;
end.


вот... на днях на делфи переведу...
у меня есть инвайты на tfile.ru - в личку. только что зарегистрировавшимся не отсылаю
http://mg.irkutsk.ru - сайт Иркутского Городского отделения Молодой Гвардии
Всё, что меня не убивает, делает меня сильнее
Аватара пользователя
Krox
постоялец
 
Сообщения: 770
Зарегистрирован: Вс 16.07.2006, 2:02
Откуда: Иркутск

#8  Iver » Пт 27.06.2008, 0:44

Ну вот, про что я и говорил, а та формула это слишком "общо"
Аватара пользователя
Iver
постоялец
 
Сообщения: 171
Зарегистрирован: Чт 21.06.2007, 15:16
Откуда: не указан

#9  Vadya corp. » Пт 27.06.2008, 0:44

Iver Каюсь, действительно, есть же формула по вычислению через миноры, там просто сводим в конце к матрице второго-третьего порядка, и рекурсивно крутим :)
Если хотите пофотаться бесплатно, то пишите в личку
Аватара пользователя
Vadya corp.
постоялец
 
Сообщения: 1136
Зарегистрирован: Пт 26.05.2006, 20:02
Откуда: Иркутск

#10  Iver » Пт 27.06.2008, 0:47

но тест проходит на матрице 2х2

Гм...
const
n = 2;
Vadya corp.
и рекурсивно крутим (*только вначале крутим)

не, крутить то зачем - звездочкой его, звездочкой :)
Аватара пользователя
Iver
постоялец
 
Сообщения: 171
Зарегистрирован: Чт 21.06.2007, 15:16
Откуда: не указан

#11  Krox » Пт 27.06.2008, 15:18

Гм...
const
n = 2;


я когда код нашёл проверил только его на работоспособность...
спасибо) мне меньше копаться :D

Добавлено спустя 3 часа 26 минут 10 секунд:

что-то очень сильно туплю... не получается сделать на делфи(((

Добавлено спустя 39 минут 56 секунд:

Код: Выделить всё
{Вычисление детерминанта (определителя) матрицы
приведением к диагональному виду.
}
program denominator;
uses crt;
const
  MaxN=3;
  epsilon=1E-10;
type
  matrix=array[1..maxN,1..maxN] of Real;
var
  a: matrix;
  i,j: integer;
  determ:real;

function det(a:matrix;n:integer):real;
var i,j,k:integer; d:real;
begin
  for i:=1 to pred(n) do begin
    if abs(a[i,i])<epsilon then begin
      det:=0.0; exit
    end;

    for j:=succ(i) to n do begin
      d:=a[j,i]/a[i,i];
      for k:=i to n do
        a[j,k]:=a[j,k]-d*a[i,k];
    end;
  end;

  d:=1.0;
  for i:=1 to n do d:=d*a[i,i];
  det:=d;
end;

begin
  for i:=1 to MaxN do
    for j:=1 to MaxN do read(a[i,j]);
  determ:=det(a,3);
  WriteLn(determ:0:0);
  readkey
end.


вот ещё нашёл... кажется это проще будет перевести на делфи)

Добавлено спустя 6 минут 31 секунду:

может кто сказать, для чего epsilon=1E-10; нужно?
у меня есть инвайты на tfile.ru - в личку. только что зарегистрировавшимся не отсылаю
http://mg.irkutsk.ru - сайт Иркутского Городского отделения Молодой Гвардии
Всё, что меня не убивает, делает меня сильнее
Аватара пользователя
Krox
постоялец
 
Сообщения: 770
Зарегистрирован: Вс 16.07.2006, 2:02
Откуда: Иркутск

#12  Vadya corp. » Пт 27.06.2008, 17:21

epsilon - это судя по всему бесконечно малая величина, которую можно не учитывать в конечном ответе, ну там сравнивается по модулю элемент матрицы с 10^-10 степени, соответственно, если меньше, то определитель нулю равен по этому столбцу/cтроке
Если хотите пофотаться бесплатно, то пишите в личку
Аватара пользователя
Vadya corp.
постоялец
 
Сообщения: 1136
Зарегистрирован: Пт 26.05.2006, 20:02
Откуда: Иркутск

#13  Krox » Сб 28.06.2008, 21:39

всё сделал) всё работает... если нада конечный код могу сюда кинуть...
у меня есть инвайты на tfile.ru - в личку. только что зарегистрировавшимся не отсылаю
http://mg.irkutsk.ru - сайт Иркутского Городского отделения Молодой Гвардии
Всё, что меня не убивает, делает меня сильнее
Аватара пользователя
Krox
постоялец
 
Сообщения: 770
Зарегистрирован: Вс 16.07.2006, 2:02
Откуда: Иркутск

Аватара
спонсор



cron