Forum by laureateci.it
[ Home | REGOLE FORUM | Tutti i blog | Profilo | Registrati | CHAT | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Download Informatica | Download ICD | Download TPS | Download Magistrale | Download Specialistica | Giochi | Cerca nel web | cerca | faq | RSS ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 INFORMATICA - Secondo Anno
 Calcolo Numerico
 algoritmo di eliminazione di Gauss

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista Inserisci Faccine
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Smilies
Approvazione [^] Arrabbiato [:(!] Bacio [:X] Bevuta [:273]
Caldo [8D] Compiaciuto [8)]    
compleanno [:269]
Davvero Felice [:D] Diavoletto [}:)] Disapprovazione [V] Domanda [?]
Felice [:)] Fumata [:29] Goloso [:P] Imbarazzato [:I]
Infelice [:(] Morte improvvisa da [:62]
Morto [xx(] Occhio Nero [B)] Occhiolino [;)] Palla 8 [8]
pc [:205]    
Riproduzione [:76]
Scioccato [:O]      

   Allega file
  Clicca qui per inserire la tua firma nel messaggio.
Clicca qui per sottoscrivere questa Discussione.
    

V I S U A L I Z Z A    D I S C U S S I O N E
miss smile Inserito il - 16/05/2010 : 20:53:20
Salve ragazzi, come da oggetto vorrei sapere se qualcuno è riuscito ad implementare in Scilab l'algoritmo di eliminazione di Gauss "normale" (cioè senza pivot e senza tecnica nel massimo pivot parziale).
Questo è il codice che ho scritto io e non riesco a capire perchè non funzioni!!!

function U=gauss(A,b)
[m,n]=size(A)
if m~=n
error('La matrice dei coefficienti A deve essere quadrata!')
elseif n~=length(b)
error('Il vettore dei termini noti deve avere lo stesso numero di righe della matrice A!')
end
A1=[A b]
M=zeros(n,n)
for k=1:n
for i=k+1:n
M(i,k)=-A1(i,k)/A(k,k)
for j=k+1:n
A1(i,j)=A(i,j)+(M(i,k)*A(k,j))
end
end
end
U=A1
endfunction

Ringrazio in anticipo chi mi fosse d'aiuto.
16   U L T I M E    R I S P O S T E    (in alto le più recenti)
fozzy04 Inserito il - 11/06/2010 : 23:38:01
Informazione x i nuovi utenti:
quando dovete copiaincollare del codice, vi conviene inserirlo nel tag "code" così mantiene l'indentazione:


// fattorizzazione LU
function [L,U] = LU1 (A)
  [m,n] = size (A)
  if n ~= m
    error ( 'La matrice non è quadrata')
  end
  L = eye ( n,n)
  for k = 1 : ( n-1)
    for i = k +1 : n
      L (i,k) = A (i,k)/ A(k,k)
      for j = k +1  : n
        A(i,j) = A(i,j) - L(i,k)*A(k,j)
      end
    end
  end
  U = triu (A)
endfunction


lo trovate in alto nell'elenco dei tag dove c'è il simbolo #
Per quanto riguarda la matrice di Gauss, francescogir ha ragione, conviene inizializzarla con eye(m,n)

francescogir Inserito il - 09/06/2010 : 16:30:07
// fattorizzazione LU
function [L,U] = LU1 (A)
[m,n] = size (A)
if n ~= m
error ( 'La matrice non è quadrata')
end
L = eye ( n,n)
for k = 1 : ( n-1)
for i = k +1 : n
L (i,k) = A (i,k)/ A(k,k)
for j = k +1 : n
A(i,j) = A(i,j) - L(i,k)*A(k,j)
end
end
end
U = triu (A)
endfunction

Questo è il codice che ho scritto per la fattorizzazione LU e che funziona. Ad una rapida occhiata la memoria allocata per la matrice triangolare inferiore va inizializzata con eye e non con zeros;
i moltiplicatori di gauss nella matrice L vengono cambiati di segno , quindi all'elemento Ai,j va sottratto il prodotto L(i,k) * A(k,j).
U = triu(A) in quanto la parte triangolare inferiore della matrice non è stata modificata
francescogir Inserito il - 09/06/2010 : 16:17:24
Citazione:
Messaggio inserito da fozzy04

Citazione:
Messaggio inserito da miss smile

Salve ragazzi, come da oggetto vorrei sapere se qualcuno è riuscito ad implementare in Scilab l'algoritmo di eliminazione di Gauss "normale" (cioè senza pivot e senza tecnica nel massimo pivot parziale).
Questo è il codice che ho scritto io e non riesco a capire perchè non funzioni!!!

function U=gauss(A,b)
  [m,n]=size(A)
  if m~=n
    error('La matrice dei coefficienti A deve essere quadrata!')
  elseif n~=length(b)
    error('Il vettore dei termini noti deve avere lo stesso numero di righe della matrice A!')
  end
  A1=[A b]
  M=zeros(n,n)
  for k=1:n
    for i=k+1:n
      M(i,k)=-A1(i,k)/A(k,k)
      for j=k+1:n
        A1(i,j)=A(i,j)+(M(i,k)*A(k,j))
      end
    end
  end
  U=A1
  endfunction

Ringrazio in anticipo chi mi fosse d'aiuto.



for j=1:n


MacGyver Inserito il - 20/05/2010 : 07:53:19
Citazione:
Messaggio inserito da fozzy04

A proposito... c'è qualcuno che mi sa dire come si fa a realizzare una libreria in Scilab, così la smetto ogni volta di caricarmi a mano tutte le function che mi servono??? Ho provato ad usare la "genlib" ma credo che voglia il codice compilato...




Ah, me lo sono chiesto anche io. Ho provato ad utilizzare getd per caricare tutti i file .sci presenti nella directory corrente, ma non si possono usare path assoluti, solo relativi, quindi se metto i file su una penna usb, non mi funziona niente. Ho provato anche con exec, ma funziona con la stessa logica.
Oggi chiedo al prof.
miss smile Inserito il - 19/05/2010 : 21:34:07
Questa tua implementazione è relativa alla risoluzione di un sistema lineare n incognite per n equazioni mediante la fattorizzazione LU classica... io invece voglio implementare la risoluzione sempre di un sistema lineare nxn ma senza passare per la fattorizzazione LU, usando l'algoritmo di eliminazione di Gauss che consiste nell'affiancare alla matrice A dei coefficienti il vettore colonna b dei termini noti e procedendo come per una normale fattorizzazione LU, alla fine della quale otteremo una matrice con n righe e n+1 colonne in cui appunto le prime n colonne rappresentano la matrice U e l'ultima colonna rappresenta il vettore y (che con la fattorizzazione LU classica sarebbe stata la soluzione di Ly=b), da risolvere poi con l'algoritmo di sostituzione in indietro.
fozzy04 Inserito il - 19/05/2010 : 20:47:21
Per la risoluzione del sistema lineare ho fatto così:

function [x]=linearNN(A,b)
  // RISOLUZIONE DI UN SISTEMA LINEARE QUADRATO NxN
  // MEDIANTE FATTORIZZAZIONE LU CLASSICA
  //
  //  INPUT : A -> MATRICE QUADRATA DEI COEFFICIENTI
  //          b -> VETTORE COLONNA DEI TERMINI NOTI
  //  OUTPUT: x -> VETTORE COLONNA DELLE SOLUZIONI DEL SISTEMA
  //
  //                  STRATEGIA RISOLUTIVA
  //  Per risolvere il sistema Ax=b si eseguono i seguenti passi:
  //  1 - si fattorizza A come prodotto L*U quindi avremo L*U*x=b
  //  2 - si pone U*x=y  
  //  3 - si pone L*y=b
  //  4 - nell'equazione al punto 3 si ricava il vettore y con 
  //      il metodo di sostituzione in avanti
  //  5 - nell'equazione al punto 2 si ricava il vettore x con 
  //      il metodo di sostituzione all'indietro
  
 
  // RECUPERO LA DIMENSIONE DELLA MATRICE DEI COEFFICIENTI
  [m,n]= size(A);
  
  // RECUPERO LA LUNGHEZZA DEL VETTORE DEI TERMINI NOTI
  [p,q]= size(b);
  
  // VERIFICO LE DIMENSIONI DELL'INPUT
  if (m<>n)  |  (p<>m)  |  (q>1)
    error('ERRORE: DIMENSIONI NON CONGRUE!')
  else
    printf('\n *******************************************')
    printf('\n *  RISOLUZIONE DI UN SISTEMA LINEARE NxN  *')
    printf('\n *  MEDIANTE FATTORIZZAZIONE L*U CLASSICA  *')
    printf('\n ******************************************* \n')
  end

  // FATTORIZZAZIONE LU CLASSICA (SENZA PIVOTING)
  [L,U] = fattorizzaLU(A)
  
  // RISOLUZIONE DEL SISTEMA TRIANGOLARE INFERIORE
  y = trianginf(L,b)
  
  // RISOLUZIONE DEL SISTEMA TRIANGOLARE SUPERIORE
  x = triangsup(U,y)

endfunction


dove le tre funzioni evidenziate le ho scritte a parte; questa function prende in input A e b e restituisce direttamente il vettore delle soluzioni.


A proposito... c'è qualcuno che mi sa dire come si fa a realizzare una libreria in Scilab, così la smetto ogni volta di caricarmi a mano tutte le function che mi servono??? Ho provato ad usare la "genlib" ma credo che voglia il codice compilato...
miss smile Inserito il - 18/05/2010 : 23:27:10
fozzy, così funziona(almeno sulla matrice su cui sto lavorando!!!). Ma perchè j deve partire da 1? e poi, perchè lavora solo sulle colonne di A1 relative a A e non modifica anche la colonna dei termini noti? Cioè, ottengo la U corretta, ma non ottengo il vettore colonna y per poter poi risolvere il sistema lineare triangolare inferiore Ux=y.
fozzy04 Inserito il - 18/05/2010 : 21:40:44
Citazione:
Messaggio inserito da miss smile

Salve ragazzi, come da oggetto vorrei sapere se qualcuno è riuscito ad implementare in Scilab l'algoritmo di eliminazione di Gauss "normale" (cioè senza pivot e senza tecnica nel massimo pivot parziale).
Questo è il codice che ho scritto io e non riesco a capire perchè non funzioni!!!

function U=gauss(A,b)
  [m,n]=size(A)
  if m~=n
    error('La matrice dei coefficienti A deve essere quadrata!')
  elseif n~=length(b)
    error('Il vettore dei termini noti deve avere lo stesso numero di righe della matrice A!')
  end
  A1=[A b]
  M=zeros(n,n)
  for k=1:n
    for i=k+1:n
      M(i,k)=-A1(i,k)/A(k,k)
      for j=k+1:n
        A1(i,j)=A(i,j)+(M(i,k)*A(k,j))
      end
    end
  end
  U=A1
  endfunction

Ringrazio in anticipo chi mi fosse d'aiuto.



for j=1:n
miss smile Inserito il - 17/05/2010 : 23:54:20
si, mostra un risultato... la prima riga della matrice U è (ovviamente!) corretta; della seconda sono corretti solo 2o e 3o elemento (sto facendo la prova testandola su una matrice A 3x3) e la terza riga è completamente sbagliata!
MacGyver Inserito il - 17/05/2010 : 23:41:49
Citazione:
Messaggio inserito da miss smile

non va cmq!



ho capito che non va, ma cosa non va esattamente? mostra almeno un risultato? è parzialmente corretto?
miss smile Inserito il - 17/05/2010 : 23:35:47
non va cmq!
MacGyver Inserito il - 17/05/2010 : 19:37:08
il k deve andare da 1 a n-1, non ha senso trovare i moltiplicatori per le righe sotto la n-esima (non esistono).
poi, se fai A1(i,j)=A(i,j)+(M(i,k)*A(k,j)) vai a modificare gli elementi di A1 a partire dagli elementi di A, il che è sbagliato, poichè devi modificarli a partire dagli elementi di A1. Quindi:
A1(i,j)=A1(i,j)+(M(i,k)*A1(k,j))

prova così e dimmi.
miss smile Inserito il - 17/05/2010 : 19:22:24
A1 dovrebbe diventare "da sola" triangolare superiore...
cmq anche facendo triu(A1) non funziona...
MacGyver Inserito il - 17/05/2010 : 17:33:56
Citazione:
Messaggio inserito da miss smile

A1 = [A b] funziona, ho provato. Come seconda cosa, U la devo ottenere fattorizzando A, non semplicemente facendone la sua triangolare superiore...o no?



sì, ma alla fine non devi fare U = A1 ma U = triu(A)
miss smile Inserito il - 17/05/2010 : 17:05:35
A1 = [A b] funziona, ho provato. Come seconda cosa, U la devo ottenere fattorizzando A, non semplicemente facendone la sua triangolare superiore...o no?
MacGyver Inserito il - 17/05/2010 : 08:48:13
prima di tutto, sei sicura che A la puoi estendere con A1 = [A b]? Poi, per ottenere U devi fare la triangolare superiore di A1, cioè U = triu(A1). Questo a prima lettura e senza provare niente. prova a correggere e controlla.

Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,08 secondi.

TargatoNA.it | SuperDeejay.Net | Antidoto.org | Brutto.it | Equiweb.it | Snitz Forum 2000