[ vaske555 @ 25.01.2005. 23:31 ] @
Da li neko kojim slucajem ima kod u paskalu za racunanje determinante matrice,
ili mozda u moduli2? bilo bi mi od velike koristi!!!
HVALA
[ Alef @ 26.01.2005. 00:55 ] @
Ovo bi trebalo da ti reši problem…

Code:

program Determinanta;

var
    i, j, n, det, prod : integer;
    mat : array [0..99, 0..99] of integer;

begin
    det:= 0;

    write('Unesi n: ');
    read(n);

    for i:= 0 to n-1 do
        for j:= 0 to n-1 do
            begin
                write('Unesi element [', i, ',', j, ']: ');
                read(mat[i,j]);
            end;
    
    for i:= 0 to n-1 do
        begin
            prod:= 1;
            for j:= 0 to n-1 do
                prod:= prod * mat[(i+j) mod n, j];
            det:= det + prod;
        end;
    for i:= 0 to n-1 do
        begin
            prod:= 1;
            for j:= 0 to n-1 do
                prod:= prod * mat[(i+j) mod n, n-1-j];
            det:= det - prod;
        end;

    writeln('Determinanta je: ', det);
end.
[ _owl_ @ 26.01.2005. 00:56 ] @
U cemu je problem da sam implementiras algoritam za izracunavanje (sam algoritam je prilicno straigthforward, nema nikakvih komplikacija). Pokusaj sam da odredis neku determinantu reda veceg od 3 i posle nekoliko pokusaja sve sto radis prevedi u paskal (ili bilo koji drugi omiljeni programski jezik).
[ Marko Stankovic @ 26.01.2005. 14:30 ] @
Alef to ce resiti problem samo ukoliko imamo matrice 3x3, za sve dimenzije preko 3 ovaj algoritam koji si ti upotrebio je beskoristan.
Iskreno nije bas tako jednostavno uraditi kod za racunanje determinante jer je malo teze (bar je meni bilo) uraditi kod koji ce vrsiti sumiranje po svim mogucim permutacijama uz to vodeci racuna o broju inverzija (znaci racunanje po definiciji determinante). Resenje koje sam ja koristio je bilo da prvo Gausovim algoritmom svedemo matricu na trougaonu i determinanta je tada samo proizvod elemenata na glavnoj dijagonali.
Ja imam taj kod jos uvek ali je pisan u C-u, pa ako te interesuje da bacis pogled na njega ostavicu ga ovde, mada ne bi trebalo da bude problem da se prepravi da radi i u pascalu.
[ mucky @ 26.01.2005. 15:22 ] @
Koliko se ja secam linearne algebre, determinanta se racuna
rekurzivno, po minorima matrice. Resenje je sve samo ne efikasno, ali
100% radi. Optimizuje se analiziranjem matrice i njenim svodjenjem na
neki od pogodnijih oblika, ako je to moguce.

Pogledajte neku knjigu iz linearne algebre pa cete sigurno skontati
kako se to radi.


--
Until Eve arrived, this was a man's world. -- Richard Armour
[ Alef @ 26.01.2005. 16:47 ] @
Citat:

Marko: to ce resiti problem samo ukoliko imamo matrice 3x3


Jup… Tačno tako… Potpuno sam smeo s uma da to važi samo za matrice čije su dimenzija 3x3, a nisam čoveku hteo da komplikujem život sa Gausom . No i ovako nisam ništa uradio .

Ako se ne snađeš sa Markovim kodom, javi pa ću ti prebaciti u Pascal.
[ Alef @ 26.01.2005. 21:19 ] @
Evo, malo sam se igrao , ovo bi trebalo da radi (ukoliko opet nisam
nešto prevideo ).

Code:

program Determinanta;

var
    n, sign: integer;
    det, err : real;
    mat : array [1..100, 1..100] of real;



procedure input;
var
    i, j : integer;
begin
    write('Unesi n: ');
    read(n);

    for i:= 1 to n do
        for j:= 1 to n do
            begin
                write('Unesi element [', i, ',', j, ']: ');
                read(mat[i,j]);
            end;
end;



procedure swap_rows(a, b : integer);
var
    tmp : real;
    i : integer;
begin
    for i:= a to n do
        begin
            tmp:= mat[a,i];
            mat[a,i]:= mat[b,i];
            mat[b,i]:= tmp;
        end;
    sign:= sign * (-1);
end;



procedure eliminate(a, b : integer);
var
    d : real;
    i : integer;
begin
    d:= mat[b,a] / mat[a,a]; 
    for i:= a to n do
        mat[b,i]:= mat[b,i] - d*mat[a,i];
end;



procedure gauss;
var
    i, j : integer;
begin
    for i:= 1 to n-1 do
        begin
            j:= i+1;
            while (abs(mat[i,i]) < err) do
                begin
                    swap_rows(i, j);
                    Inc(j);
                    if (j > n) then break;
                end;
            if (j <= n) then for j:= i+1 to n do eliminate(i, j);
        end;

    for i:= 1 to n do
        det:= det * mat[i,i];
end;



Begin
    det:= 1.0;
    sign:= 1;
    err:= 0.000001;

    input();
    gauss();

    writeln('Determinanta je: ', det*sign);
End.

[ vaske555 @ 29.01.2005. 12:19 ] @
E ljudi puno hvala na sugestijama, ne mogu da verujem da ste tako azurni!!!
Mnogo ste mi pomogli narocito se zahvaljujem Alef-u, Veliko HVALA!!!