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