[ 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 |
[ vaske555 @ 25.01.2005. 23:31 ] @
[ 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 ![]() ![]() 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
![]() 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!!! Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|