PDA

Visualizza la versione completa : [Delphi]Matrici e determinanti


FrA_05
14-04-2008, 16:05
Ciao a tutti,mi stato dato da fare un programma in deplhi che calcoli il determinante di una matrice generica utilizzando il metodo del pivot...ho provato diversi tentativi ma niente sembra funzionare,c' qualcuno disposto a darmi una mano???grazie mille...

mondobimbi
14-04-2008, 16:46
si basa su fatto che il determinante di una matrice triangolare semplicemente uguale al prodotto degli elementi sulla diagonale.
Per triangolare una matrice (utile anche per risolvere sistemi di equazioni lineari) puoi utilizzare l'algoritmo di gauss.
Io ho qualcosa in C che devi per convertire
ciao
sergio

FrA_05
14-04-2008, 17:01
S l'algoritmo lo conosco mi stato spiegato...in rete ho trovato qualcosa ma non funziona...ho provato qualcosa da me...ma niente...il linguaggio C non l ho mai toccato...pensi che sarei in grado di convertirlo?

LeleFT
14-04-2008, 17:09
Come espressamente indicato nel regolamento nessuna discussione pi importante delle altre, di conseguenza un titolo che riporti la dicitura "importante" non ha alcun senso e viola il regolamento stesso.
Lo stesso regolamento vieta l'utilizzo di epiteti e altre forme insensate come "help", "aiuto", ecc, che non servono a niente.

Consiglio all'autore della discussione di rileggere il regolamento.

Intanto correggo il titolo.


Ciao. :ciauz:

mondobimbi
14-04-2008, 17:19
ho cercato di commentarlo

// in C { e } equivalgono a begin e end
// il ciclo for devi modificarlo con
// for (int k=0; i < n - 1;k++)
// for k:=0 to n-2 do ....

bool Gauss(VETTORE &I, QMATRICE &C, VETTORE &T)
{

// Triangolazine di un sistema di n Equazioni e n Incognite
// C la MATRICE dei coeffcienti
// T il VETTORE dei termini noti
// I il vettore delle incognite


// ti devi riferire solo alla matrice C

float const e = 0.00001;

int n = C.Dim(); // la dimensione della matrice

for (int k = 0; k < n - 1; k++) {
// Pivotal condensation
// si ricerca la equazione con il max C(m, k)
// e si scambia con equazione attuale (la riga attuale)
float max = fabs(C(k , k));//valore assoluto
int p = k;
for (int m = k + 1; m < n; m++)
if (fabs(C(m, k)) > max) {
max = fabs(C(m, k)) ;
p = m;
}
if (max <= e) {
// il sistema non risolvibile
// penso che il determinante sia nullo in questo caso
MessageOut("Ill-Conditioned");
return false;
} // end if max
if (p != k) {
// swap scambia due righe
C.swap(p, k) ;
T.swap(p, k);
}

// fine Pivotal condensation
for (int i = k + 1; i < n; i++) {
float u = C(i, k) / C(k, k);
T(i) -= u * T(k);
for (int j = k; j < n; j++)
C(i, j) -= u * C(k, j);
} // end for i ...
} // end for k ...

// qui ti puio fermare e calcolare il determinante
// come sottoprodotto della triangolazione
// da qui in poi non penso ti interessi

// back substitution
float den = C(n - 1, n - 1);
if (den)
I(n - 1) = T(n - 1) / C(n - 1, n - 1);
else I(n - 1)=999999; // BIG_FLOAT

for (int i = n - 2; i >= 0; i--) {
float sum = 0;
for (int j = i + 1; j <= n - 1; j++)
sum += C(i, j) * I(j);
I(i) = (T(i) - sum) / C(i, i);
} // for i...

return true ;
}

FrA_05
16-04-2008, 21:04
Grazie mille per l'aiuto,sono riuscito a fare il programma,questo il risultato


procedure TForm1.Button4Click(Sender: TObject);
var a,b,h,z,k,x,y,s,o,Rpiv,Cpiv:integer;
piv,Rtemp,Ctemp:real;
begin
if mat=false then begin showmessage('Carica una matrice');exit;end;
s:=1;
for k:=0 to ordine-2 do
begin
piv:=abs(matrice[k,k]);
Rpiv:=k;
Cpiv:=k;
for a:=k to ordine-1 do
for b:=k to ordine-1 do
if abs(matrice[a,b])>piv then
begin
piv:=abs(matrice[a,b]);
Rpiv:=a;
Cpiv:=b;
end;
if Rpiv<>k then
begin
s:=s*(-1);
for h:=k to ordine-1 do
begin
Rtemp:=matrice[Rpiv,h];
matrice[Rpiv,h]:=matrice[k,h];
matrice[k,h]:=Rtemp;
end;
end;
if Cpiv<>k then
begin
s:=s*(-1);
for z:=k to ordine-1 do
begin
Ctemp:=matrice[z,Cpiv];
matrice[z,Cpiv]:=matrice[z,k];
matrice[z,k]:=Ctemp;
end;
end;
for x:=k+1 to ordine-1 do
for y:=ordine-1 downto k do
matrice[x,y]:=matrice[x,y]-matrice[x,k]*matrice[k,y]/matrice[k,k];
end;
det:=s;
for o := 0 to ordine - 1 do
det:=det*matrice[o,o];
determinanteedt.text:=floattostr(det);
end;



Il problema che la mia prof vorrebbe che lo facessi creando delle procedure e richiamandole poi nel momento opportuno,tipo la procedure per la ricerca del pivot,per lo scambio delle righe ecc ecc...solo che non sono molto pratico in questo...un aiutino?

mondobimbi
17-04-2008, 16:50
Effettivamente la prima procedura che puoi scrivere quella che scambia due elementi della matrice, come hai fatto nel frammento di codice



Rtemp:=matrice[Rpiv,h];
matrice[Rpiv,h]:=matrice[k,h];
matrice[k,h]:=Rtemp;


Nella programmazione ad oggetti potresti dichiararti un oggetto Matrice che ha come funzione membro una funzione swap(integer i,j), che scambia i due elementi secondo il frammento di codice che hai scritto.

Nella programmazione procedurale invece, se ne conosci la sintassi, potresti provare a passargli un puntatore alla matrice, dereferenziarli all'interno della procedura e scrivere sempre lo stesso codice.

Per il pivot il discorso lo stesso, o programmazione ad oggetti con funzione membro che modifica gli elementi della matrice o programmazione procedurale.
Se mi viene in mente qualche altro sistema te lo dico
ciao
sergio

Loading