Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    3

    [Delphi]Matrici e determinanti...aiuto!!importante..

    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...

  2. #2
    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

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    3
    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?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    ho cercato di commentarlo
    Codice PHP:
    // 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 &IQMATRICE &CVETTORE &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 0.00001;

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

        
    for (int k 01k++) {
            
    // 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));//valore assoluto
            
    int p k;
            for (
    int m 1nm++)
                if (
    fabs(C(mk)) > max) {
                    
    max fabs(C(mk)) ;
                    
    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 (!= k) {
                
    // swap scambia due righe
                
    C.swap(pk) ;
                
    T.swap(pk);
            }

            
    // fine Pivotal condensation
            
    for (int i 1ni++) {
                
    float u C(ik) / C(kk);
                
    T(i) -= T(k);
                for (
    int j knj++)
                    
    C(ij) -= C(kj);
            } 
    // 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(11);
        if (
    den)
            
    I(1) = T(1) / C(11);
        else 
    I(1)=999999;   // BIG_FLOAT

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

        
    return true ;


  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    3
    Grazie mille per l'aiuto,sono riuscito a fare il programma,questo è il risultato
    Codice PHP:
    procedure TForm1.Button4Click(SenderTObject);
    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-do
      
    begin
        piv
    :=abs(matrice[k,k]);
        
    Rpiv:=k;
        
    Cpiv:=k;
         for 
    a:=k to ordine-do
          for 
    b:=k to ordine-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-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-do
           
    begin
            Ctemp
    :=matrice[z,Cpiv];
            
    matrice[z,Cpiv]:=matrice[z,k];
            
    matrice[z,k]:=Ctemp;
           
    end;
         
    end;
        for 
    x:=k+1 to ordine-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 
    := 0 to ordine 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?

  7. #7
    Effettivamente la prima procedura che puoi scrivere è quella che scambia due elementi della matrice, come hai fatto nel frammento di codice

    Codice PHP:
            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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.