vuoi
o PayPal
tutte le volte che vuoi
SCRIPT:
for n=3:8
A=rand(n,n); %genera la matrice A(n,n) con elementi casuali
b=A*ones(n,1); %genera il vettore dei coefficienti noti b
[L,U,P]=lu(A); %fattorizza A
scambi=P*b; %applica gli scambi a b
y=L\scambi;
x=U\y;
xc=ones(n,1); %genera il vettore delle soluzioni esatte
e=norm(xc-x)/norm(xc) %calcola l’errore
r=norm(b-A*x)/norm(b) %calcola il residuo
end
%Matrice di Hilbert
For n=3:8
H=hilb(n);
b=H*ones(n,1);
[L,U,P]=lu(H);
scambi=P*b;
y=L\scambi;
x=U\y;
xc=ones(n,1);
e=norm(xc-x)/norm(xc)
r=norm(b-H*x)/norm(b)
end la funzione risolve sistemi di equazioni del tipo Ax=b con A matrice
SCOPO tridiagonale
L'algoritmo implementa la fattorizzazione particolarizzata per matrici
DESCRIZIONE tridiagonali, senza applicazione di pivot, al fine di preservare la
struttura della matrice.l’algoritmo effettua i controlli necessari affinché
si rispetti la sintassi dei valori inseriti in input. Poi esegue anche un
controllo per verificare la dominaza della diagonale principale. Poi
esegue la fattorizzazione LU per matrici tridiagonali per finire col
calcolo del vettore x di dimensione n,che rappresenta la soluzione del
sistema.
Raccomandazioni sull'uso
la matrice, supposta di ordine n, deve essere inserita sotto forma di tre
vettori d, e, f,di lunghezza rispettivamente n, n-1, n-1,n rappresentanti
la diagonale principale, quella inferiore e quella superiore.
Pi si deve inserire anche il vettore b,che rappresenta il vettore dei temini
noti di dimensione n.
input
PARAMETRI DI d - vettore di reali, diagonale principale di A
I/O e - vettore di reali, diagonale inferiore di A
f - vettore di reali, diagonale superiore di A
b – vettore dei termini noti
output
x – vettore delle soluzioni
l’algoritmo segnala un errore quando:
INDICATORI DI - si inseriscono i 3 vettori non rispettando le dimensioni.
ERRORE - si inseriscono i 3 vettori formando una matrice a diagonale principale
non dominante
- non si rispetta il numero di parametri che riceve la funzione.
la complessità è O(n)
TEMPO DI
ESECUZIONE sono allocati 4 array di dimensione n ,n, n-1, n-1
MEMORIA
RICHIESTA >> a = [ 3 4 1 ]; d = [ 12 52 13 19 ]; f = [ 1 6 4 ]; b = [ 1 1 1 1 ];
ESEMPIO >> x = tdiag(a,d,f,b)
D’USO x =
0.08269901190255 0.00761185716938 0.05934773191410 0.04950801410978
metodo esatto a meno del condizionamento della matrice e degli errori
ACCURATEZZA di round-off
CASI DI TEST:
1)
>> a = [ 0 3 6 ]; d = [ 3 3 13 19 ]; f = [ 2 0 4 ]; b = [ 1 1 1 1];
>> x = tdiag(a,d,f,b)
x =
0.11111111111111 0.33333333333333 -0.01793721973094 0.05829596412556
2)
>> a = [ 44 3 6 ]; d = [ 3 3 13 19 ]; f = [ 2 0 4 ]; b = [ 1 1 1 1];
>> x = tdiag(a,d,f,b)
la matrice inserita non è a diagonale strettamente dominante
x =
riprova!
3)
>> a = [ 2 3 6 ]; d = [ 3 ]; f = [ 2 0 4 ]; b = [ 1 1 1 1];
>> x = tdiag(a,d,f,b)
la matrice inserita non è tridiagonale
x =
reinseriscila!
4)
>> a = [ 1 3 6 ]; d = [ 3 3 13 19 ]; f = [ 2 0 4 ]; b = [0 0 0 0];
>> x = tdiag(a,d,f,b)
x =
0 0 0 0
5)
>> a = [ 1 1 1 ]; d = [ 3 4 5 6 ]; f = [ 0 0 0 ];
>> x = tdiag(a,d,f,5)
la matrice inserita non è tridiagonale
x =
reinseriscila!
6)
>> a = [ 1 1 1 ]; d = [ 3 4 5 6 ]; f = [ 0 0 0 ];
>> x = tdiag(a,d)
errore il numero dei parametri non è corretto
x =
reinserisci i vettori
7)
>> a = [ 1 2 3 ]'; d = [ 3 4 5 6 ]; f = [ 0 0 0 ];b=[1 1 1 1];
>> x = tdiag(a,d,f,b)
a =
1 2 3
x =
0.33333333333333 0.16666666666667 0.13333333333333 0.10000000000000
SCRIPT:
function x = tdiag(a,d,f,b)
%la funzione risolve sistemi di equazioni del tipo Ax=b con A matrice tridiagonale
% parametri di INGRESSO:
% a - vettore della diagonale inferiore
% d - vettore della diagonale principale
% f - vettore della diagonale superiore
% b - vettore dei termini noti
% parametri di USCITA:
% x - vettore delle soluzioni
% UTILIZZO : x=tdiag(s,d,f,b)
if nargin ~= 4
disp('errore il numero dei parametri non è corretto')
x = 'reinserisci i vettori';
return
end
%controllo sull'inserimento dei vettori riga:
%se vengono inseriti vettori colonna,verranno cambiati in vettori riga
%sfruttando l'operatore di trasposta
l = [1 length(a)];
if l >= size(a)
else
a=a'
end
l = [1 length(d)];
if l >= size(d)
else
d=d'
end
l = [1 length(f)];
if l >= size(f)
else
f=f'
end
l = [1 length(b)];
if l >= size(b)
else
b=b'
end
a = [0 a];
f = [f 0];