1 Francesca Mazzia Dipartimento Interuniversitario di Matematica Università di Bari MATLAB:Condizionamento Sistemi Lineari. Innanzitutto vediamo qual è la funzione Matlab che ci permette di calcolare il numero di condizione di una matrice: >> help cond COND Condition number with respect to inversion. COND(X) returns the 2-norm condition number (the ratio of the largest singular value of X to the smallest). Large condition numbers indicate a nearly singular matrix. COND(X,P) returns the condition number of X in P-norm: NORM(X,P) * NORM(INV(X),P). where P = 1, 2, inf, or fro. See also RCOND, CONDEST, CONDEIG, NORM, NORMEST. >> [ 9 1 2
2 9 3 2 1 4 8 1 8 6 7] 9 1 2 9 3 2 1 4 8 1 8 6 7 >> cond(a) 23.5314 La matrice A ha numero di condizione piccolo quindi è ben condizionata. Ora costruiamo la matrice di Hilbert che è una classica matrice mal condizionata e ci calcoliamo il numero di condizione. L istruzione hilb(n) genera una matrice N per N con elementi 1/(i+j-1), >> hilb(4); >> cond(a) 1.5514e+4 >> hilb(5); >> cond(a) 4.7661e+5 Il numero di condizione cresce al crescere di N.
3 >> hilb(1); >> cond(a) 1.625e+13 Per N=1 la matrice diventa molto mal condizionata. Proviamo a risolvere un sistema lineare usando la function del Matlab, l algoritmo è stabile, ma la soluzione numerica è molto diversa da quella teorica. Costruiamoci un vettore con elementi tutti uguali ad 1 >> x = ones(1,1); >> b=a*x b = 2.929 2.199 1.632 1.3468 1.1682 1.349.937.8467.7773.7188 Il nostro sistema lineare ha termine noto b e soluzione teorica x, calcoliamo la soluzione numerica: >> xn = A\b xn = 1. 1. 1. 1.
4 1.1.9997 1.5.9995 1.2.9999 si vede chiaramente che l errore è molto alto,calcoliamo l errore relativo >> norm(xn-x, inf )/norm(x, inf ) 4.76e-4 Se moltiplichiamo la precisione di macchina per il numero di condizione otteniamo: >> format short e >> eps*cond(a) 3.5582e-3 Quando risolviamo il sistema perturbato: (A + δa)δx = δb δax l errore relativo verifica la seguente disuguaglianza: δx x ( A 1 A δb 1 A 1 δa b + δa ) A e la perturbazione relativa sui dati di input sarà collegata alla precisione di macchina perchè lavoriamo con numeri floating point, in questo caso l errore relativo sarà vicino a eps cond(a) e quindi molto grande, qualsiasi algoritmo utilizziamo per la soluzione. Calcoliamo il residuo
5 >> r=a*xn-b r = Il residuo ci dice che abbiamo calcolato una soluzione accurata, ma in realtà l errore è grande perchè a matrice è mal condizionata. Il condizionamento di una matrice può essere modificato dallo SCALING. Con tale metodo si va alla ricerca di due matrici diagonali D 1 e D 2 in modo da minimizzare K(D 1 AD 2 ). Esempio: consideriamo la seguente matrice: >> A=[1.e-1 9.e-1-4.e-1 9.e-1-4.e-1 1.e-1] 1.e-1 9.e-1-4.e-1 9.e-1-4.e-1 1.e-1 >> D1=diag([1 1 1e1]) D1 = 1.e+ 1.e+ 1.e+1
6 >> D1*A 1.e-1 9.e-1-4.e-1 9.e-1-4.e-1 1.e+ >> cond(a,1) 2.6e+1 >> cond(d1*a,1) 1.8e+1 >> D2=diag([1e1 1 1]) D2 = 1.e+1 1.e+ 1.e+ >> A*D2 1.e+ 9.e-1-4.e-1 9.e-1-4.e-1 1.e-1 >> cond(a*d2,1) 2.6e+1 >> cond(d1*a*d2,1) 3.8e+ Esempio: si consideri la matrice A e il vettore b dati da: >> format short e
7 >> A=[1.2969.8648;.2161.1441] 1.2969e+ 2.161e-1 8.648e-1 1.441e-1 >> b=[.8642;.144] b = 8.642e-1 1.44e-1 La soluzione esatta del sistema Ax = b è: >> x=a\b x = 2.e+ -2.e+ Sia ora >> xtilde=[.9911;-.487] xtilde = 9.911e-1-4.87e-1 e sia
8 >> r=a*xtilde-b r = -1.e-8 1.e-8 Questo valore di r fa intendere che xtilde è una buona approssimazione della soluzione esatta anche se in realtà non lo è. La matrice inversa di A è data da: >> inv(a) 1.441e+7-2.161e+7-8.648e+7 1.2969e+8 per cui >> cond(a,inf) 3.277e+8 Quindi A è mal condizionata.
9 Fattorizzazione di Cholesky. Costruiamo una funzione Matlab che ci permette di effettuare la fattorizzazione di Cholesky di una matrice A : function L = fchol(a) % % FATTORIZZAZIONE DI CHOLESKY % % Dati di input: % matrice quadrata % % Dati di output: % L = matrice triangolare inferiore % tale che L*L [n,m]=size(a); if n ~= m error( ERRORE: la matrice di input non e quadrata ) end L=zeros(n,n); for k=1:n if (A(k,k)-sum(L(k,1:k-1).^2))< error( ERRORE: la matrice di input non e definita positiva ) else L(k,k)=sqrt(A(k,k)-sum(L(k,1:k-1).^2)); for j=k+1:n L(j,k)=(A(k,j)-sum(L(k,1:k-1).*L(j,1:k-1)))/L(k,k); end end end
1 Esempio: >> A=[1 2 3;2 5 4;3 4 8] 1 2 3 2 5 4 3 4 8 >> L=fchol(A)??? Error using ==> fchol ERRORE: la matrice di input non e definita positiva >> A=[1-1 -1;-1 2 ;-1 3] 1-1 -1-1 2-1 3 >> L=fchol(A) L = 1-1 1-1 -1 1 >> A-L*L
11 >> help chol CHOL Cholesky factorization. CHOL(X) uses only the diagonal and upper triangle of X. The lower triangular is assumed to be the (complex conjugate) transpose of the upper. If X is positive definite, then R = CHOL(X) produces an upper triangular R so that R *R = X. If X is not positive definite, an error message is printed. [R,p] = CHOL(X), with two output arguments, never produces an error message. If X is positive definite, then p is and R is the same as above. But if X is not positive definite, then p is a positive integer. When X is full, R is an upper triangular matrix of order q = p-1 so that R *R = X(1:q,1:q). When X is sparse, R is an upper triangular matrix of size q-by-n so that the L-shaped region of the first q rows and first q columns of R *R agree with those of X. See also CHOLINC, CHOLUPDATE. Se A è definita positiva allora dopo l istruzione R = chol(a) la variabile R è la matrice triangolare superiore della fattorizzazione di Cholesky ed è tale che R R = A Infatti:
12 >> A=[1-1 -1;-1 2 ;-1 3] 1-1 -1-1 2-1 3 >> R=chol(A) R = >> A-R *R 1-1 -1 1-1 1 Costruima altre matrici di esempio usando la funzione gallery del Matlab. Esempio: >> gallery( minij,5) 1 1 1 1 1 1 2 2 2 2 1 2 3 3 3 1 2 3 4 4 1 2 3 4 5
genera una matrice simmetrica e definita positiva. Calcoliamo gli autovalori di A: 13 >> eig(a) 2.7155e-1 3.5325e-1 5.8296e-1 1.4487e+ 1.2344e+1 sono tutti positivi. Calcoliamo la fattorizzazione di Cholesky: >> R = chol(a) R = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 >> R *R 1 1 1 1 1 1 2 2 2 2 1 2 3 3 3 1 2 3 4 4 1 2 3 4 5 Costruimoci una matrice simmetrica ma non definita positiva:
14 >> [ 1 3 5; 3 1 2; 5 2 1] >> eig(a) 1 3 5 3 1 2 5 2 1-4.1284e+ -7.169e-1 7.8391e+ e proviamo ad eseguire la fattorizzazione di CHOLESKY: >> R = chol(a)??? Error using ==> chol Matrix must be positive definite. >> Si verifica un errore perche la fattorizzazione esiste solo per matrici definite positive.