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
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

miss smile
Utente medio


Regione: Puglia
Prov.: Bari
Città: Conversano


Inserito il - 16/05/2010 : 20:53:20  Mostra Profilo  Visita l'Homepage di miss smile Invia a miss smile un Messaggio Privato  Rispondi Quotando
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.

MacGyver
Utente giovane



Inserito il - 17/05/2010 : 08:48:13  Mostra Profilo  Visita l'Homepage di MacGyver Invia a MacGyver un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

miss smile
Utente medio


Regione: Puglia
Prov.: Bari
Città: Conversano


Inserito il - 17/05/2010 : 17:05:35  Mostra Profilo  Visita l'Homepage di miss smile Invia a miss smile un Messaggio Privato  Rispondi Quotando
A1 = [A b] funziona, ho provato. Come seconda cosa, U la devo ottenere fattorizzando A, non semplicemente facendone la sua triangolare superiore...o no?
Torna all'inizio della Pagina

MacGyver
Utente giovane



Inserito il - 17/05/2010 : 17:33:56  Mostra Profilo  Visita l'Homepage di MacGyver Invia a MacGyver un Messaggio Privato  Rispondi Quotando
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)
Torna all'inizio della Pagina

miss smile
Utente medio


Regione: Puglia
Prov.: Bari
Città: Conversano


Inserito il - 17/05/2010 : 19:22:24  Mostra Profilo  Visita l'Homepage di miss smile Invia a miss smile un Messaggio Privato  Rispondi Quotando
A1 dovrebbe diventare "da sola" triangolare superiore...
cmq anche facendo triu(A1) non funziona...
Torna all'inizio della Pagina

MacGyver
Utente giovane



Inserito il - 17/05/2010 : 19:37:08  Mostra Profilo  Visita l'Homepage di MacGyver Invia a MacGyver un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

miss smile
Utente medio


Regione: Puglia
Prov.: Bari
Città: Conversano


Inserito il - 17/05/2010 : 23:35:47  Mostra Profilo  Visita l'Homepage di miss smile Invia a miss smile un Messaggio Privato  Rispondi Quotando
non va cmq!
Torna all'inizio della Pagina

MacGyver
Utente giovane



Inserito il - 17/05/2010 : 23:41:49  Mostra Profilo  Visita l'Homepage di MacGyver Invia a MacGyver un Messaggio Privato  Rispondi Quotando
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?
Torna all'inizio della Pagina

miss smile
Utente medio


Regione: Puglia
Prov.: Bari
Città: Conversano


Inserito il - 17/05/2010 : 23:54:20  Mostra Profilo  Visita l'Homepage di miss smile Invia a miss smile un Messaggio Privato  Rispondi Quotando
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!
Torna all'inizio della Pagina

fozzy04
Utente medio

fractal


Regione: Puglia
Prov.: Bari
Città: Palo del Colle


Inserito il - 18/05/2010 : 21:40:44  Mostra Profilo  Visita l'Homepage di fozzy04 Invia a fozzy04 un Messaggio Privato  Rispondi Quotando
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

"... io cerco di prendere dei muratori e farne degli architetti, ma voi sempre muratori rimanete! (F.Esposito)


Il mio sito MOLTO sperimentale http://effedigi.altervista.org
Torna all'inizio della Pagina

miss smile
Utente medio


Regione: Puglia
Prov.: Bari
Città: Conversano


Inserito il - 18/05/2010 : 23:27:10  Mostra Profilo  Visita l'Homepage di miss smile Invia a miss smile un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

fozzy04
Utente medio

fractal


Regione: Puglia
Prov.: Bari
Città: Palo del Colle


Inserito il - 19/05/2010 : 20:47:21  Mostra Profilo  Visita l'Homepage di fozzy04 Invia a fozzy04 un Messaggio Privato  Rispondi Quotando
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...

"... io cerco di prendere dei muratori e farne degli architetti, ma voi sempre muratori rimanete! (F.Esposito)


Il mio sito MOLTO sperimentale http://effedigi.altervista.org

Modificato da - fozzy04 in data 19/05/2010 20:53:44
Torna all'inizio della Pagina

miss smile
Utente medio


Regione: Puglia
Prov.: Bari
Città: Conversano


Inserito il - 19/05/2010 : 21:34:07  Mostra Profilo  Visita l'Homepage di miss smile Invia a miss smile un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

MacGyver
Utente giovane



Inserito il - 20/05/2010 : 07:53:19  Mostra Profilo  Visita l'Homepage di MacGyver Invia a MacGyver un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

francescogir
Nuovo Utente


Regione: Puglia
Prov.: Bari
Città: bari


Inserito il - 09/06/2010 : 16:17:24  Mostra Profilo  Visita l'Homepage di francescogir  Invia a francescogir un messaggio Yahoo! Invia a francescogir un Messaggio Privato  Rispondi Quotando
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



francesco girardi
Torna all'inizio della Pagina

francescogir
Nuovo Utente


Regione: Puglia
Prov.: Bari
Città: bari


Inserito il - 09/06/2010 : 16:30:07  Mostra Profilo  Visita l'Homepage di francescogir  Invia a francescogir un messaggio Yahoo! Invia a francescogir un Messaggio Privato  Rispondi Quotando
// 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

francesco girardi
Torna all'inizio della Pagina

fozzy04
Utente medio

fractal


Regione: Puglia
Prov.: Bari
Città: Palo del Colle


Inserito il - 11/06/2010 : 23:38:01  Mostra Profilo  Visita l'Homepage di fozzy04 Invia a fozzy04 un Messaggio Privato  Rispondi Quotando
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)


"... io cerco di prendere dei muratori e farne degli architetti, ma voi sempre muratori rimanete! (F.Esposito)


Il mio sito MOLTO sperimentale http://effedigi.altervista.org

Modificato da - fozzy04 in data 11/06/2010 23:43:21
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,25 secondi.

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