[ peromalosutra @ 27.11.2005. 21:12 ] @
Napravio sam program koji rjesava sistem od 3 jednacine sa 3 nepoznate i htio bih da ga proširim tako da može da radi sa praktično neograničenim brojem jednačina (npr. 1000 jednačina sa 1000 nepoznatih) i sve sam u programu tome podredio, ali ne znam kako da uradim funkciju RAZVIJ_DET (koja računa determinantu matrice), tako da može da radi sa matricama n*n, (n<maxint). Kod mene ova funkcija radi samo sa matricama 3*3 i to mi je jedina prepreka da u potpunosti završim program.



Code:

program SISTEM_JEDNACINA;
Uses WinCrt;
const jednacina=3;
type MATRICA= array[0..jednacina,0..jednacina+1] of Real;
var d:array[0..jednacina] of real;
    a,det:MATRICA;
    X:array[1..jednacina] of real;
    var i:integer;
    


procedure UNOS;
var i,j:integer;
begin
writeln (' UNESI JEDNACINU OBLIKA ax+by+cz=d ');
for i:=1 to jednacina do
    begin
    writeln;
    writeln (i,') ');
    for j:=1 to jednacina+1 do
        begin
        write ('a[',i,',',j,']=');
        readln(a[i,j]);
        end;
    end;
end;

procedure DETERMINANTA (a:matrica; n:integer; var det:matrica);
{pravi matricu za odredjivanje determinante, gdje je n=0 matrica sistema,
 n=1 matrica za 1. nepoznatu, n=2 za drugu, itd. }
var i,j:integer;
begin
writeln (n,')-------------------------');
for i:=1 to jednacina do
    begin
    writeln;
    for j:=1 to jednacina do
        begin
        if j=n
           then det[i,j]:=a[i,jednacina+1]
           else det[i,j]:=a[i,j];
        write (det[i,j]:3:2,'  ');
        end;
    end;
    writeln;
writeln;
end;

function RAZVIJ_DET (det:matrica):real;
{funkcija koja odredjuje determinantu matrice}
begin
RAZVIJ_DET:=det[1,1]*det[2,2]*det[3,3]+det[2,1]*det[3,2]*det[1,3]+det[3,1]*det[1,2]*det[2,3]
           -det[3,1]*det[2,2]*det[1,3]-det[2,1]*det[3,3]*det[1,2]-det[1,1]*det[3,2]*det[2,3];
end;

begin
UNOS;
writeln;
for i:=0 to jednacina do
    begin
    DETERMINANTA (a,i,det);
    d[i]:=RAZVIJ_DET(det);
    writeln ('d[',i,']=',d[i]:3:2);
    end;
if d[0]=0
   then
   begin
   write ('> Greska, D=0');
   exit;
   end;
writeln;
for i:=1 to jednacina do
    begin
    x[i]:=d[i]/d[0];
    writeln ('x[',i,']=',x[i]:3:2);
    end;

end.


ps: Ovo je pitanje možda više za matematički podforum, ali sam ga zbog programerske prirode postavio ovdje.

HVALA!
[ NrmMyth @ 27.11.2005. 21:23 ] @
Objani kako se racuna determinanta, pa cu ti ja pomoci.
... Ili jednostavno pricekaj nekoga tko zna.
[ peromalosutra @ 28.11.2005. 15:03 ] @
Pa ima više načina za računanje determinante matrice; Ja sam koristio Sarusovo pravilo koje važi za matrice 3*3. Baš smo u školi učili način kako se matrice n-tog reda mogu pretvoriti u matrice (n-1)-og reda i na osnovu toga ću riješititi problem, samo sada moram da smislim kako da to implementiram u program.
Sad ću pokušati da napravim proceduru koja će matricu n-tog reda svoditi na matricu 3. reda, ako uspijem - problem je riješen.
[ Srđan Krstić @ 28.11.2005. 17:01 ] @
Za resavanje sistema n jednacina sa n nepoznatih koristi se Gausov algoritam. Nisam kuci trenutno, kad odem naci cu disk sa raznoraznim algoritmima pa cu da posaljem kod. Ideja je da se uz pomoc svake jednacine eliminise po jedna promeljiva iz svih ostalih (sto je upravo kao da razvijas determinantu). Npr:



Sada prvu jednacinu pomnozis sa i dodas drugoj, cime eliminises iz druge jednacine, i tako dalje do n-te. Onda predjes na drugu i eliminises nadalje, itd itd. Na kraju ces dobiti jednu jednacinu tipa , odakle trivijalno dobijas , pa vratis to u pretposlednju da dobijes , itd. Inace, ustvari si eliminisanjem dobio matricu u kojoj su ispod glavne dijagonale sve nule, pa ce determinanta biti samo proizvod elemenata na dijagonali.

Elem, to je tako u teoriji, ako mozes da iskucas sam super, ako ne kad nadjem kod i malo kasvetnije objasnjenje okacicu. Inace slozenost algoritma je .

[Ovu poruku je menjao Srđan Krstić dana 28.11.2005. u 18:07 GMT+1]
[ Mihailo Kolundzija @ 01.12.2005. 19:41 ] @
Pogledaj odgovarajuće poglavlje knjige "Numerical Recipes in C".

http://www.library.cornell.edu/nr/cbookcpdf.html
[ tosa @ 14.12.2005. 09:59 ] @
Malo teorije uvek pomogne:

http://mathworld.wolfram.com/Determinant.html