Autore |
Discussione |
|
miss smile
Utente medio
Regione: Puglia
Prov.: Bari
Città: Conversano
|
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.
|
|
MacGyver
Utente giovane
|
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. |
|
|
miss smile
Utente medio
Regione: Puglia
Prov.: Bari
Città: Conversano
|
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
Utente giovane
|
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
Utente medio
Regione: Puglia
Prov.: Bari
Città: Conversano
|
Inserito il - 17/05/2010 : 19:22:24
|
A1 dovrebbe diventare "da sola" triangolare superiore... cmq anche facendo triu(A1) non funziona... |
|
|
MacGyver
Utente giovane
|
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
Utente medio
Regione: Puglia
Prov.: Bari
Città: Conversano
|
Inserito il - 17/05/2010 : 23:35:47
|
non va cmq! |
|
|
MacGyver
Utente giovane
|
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
Utente medio
Regione: Puglia
Prov.: Bari
Città: Conversano
|
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! |
|
|
fozzy04
Utente medio
Regione: Puglia
Prov.: Bari
Città: Palo del Colle
|
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
|
"... 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 |
|
|
miss smile
Utente medio
Regione: Puglia
Prov.: Bari
Città: Conversano
|
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
Utente medio
Regione: Puglia
Prov.: Bari
Città: Palo del Colle
|
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...
|
"... 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 |
|
|
miss smile
Utente medio
Regione: Puglia
Prov.: Bari
Città: Conversano
|
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. |
|
|
MacGyver
Utente giovane
|
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. |
|
|
francescogir
Nuovo Utente
Regione: Puglia
Prov.: Bari
Città: bari
|
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
|
francesco girardi |
|
|
francescogir
Nuovo Utente
Regione: Puglia
Prov.: Bari
Città: bari
|
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 |
francesco girardi |
|
|
fozzy04
Utente medio
Regione: Puglia
Prov.: Bari
Città: Palo del Colle
|
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)
|
"... 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 |
|
|
|
Discussione |
|
|
|