algorithm - LU decomposing a square matrix matlab gauss elimination -
i'm trying create program takes square (n-by-n) matrix input, , if invertible, lu decompose matrix using gaussian elimination.
here problem: in class learned better change rows pivot largest number (in absolute value) in column. example, if matrix a = [1,2;3,4] switching rows [3,4;1,2] , can proceed gaussian elimination.
my code works matrices don't require row changes, ones do, not. code:
function newgauss(a) [rows,columns]=size(a); p=eye(rows,columns); %p permutation matrix if(det(a)==0) %% determinante 0 means no single solution disp('no solutions or infinite number of solutions') return; end u=a; l=eye(rows,columns); pivot=1; while(pivot<rows) max=abs(u(pivot,pivot)); maxi=0;%%find maximum abs value in column pivot i=pivot+1:rows if(abs(u(i,pivot))>max) max=abs(u(i,pivot)); maxi=i; end end %%if needed switch if(maxi~=0) temp=u(pivot,:); u(pivot,:)=u(maxi,:); u(maxi,:)=temp; temp=p(pivot,:); p(pivot,:)=p(maxi,:); p(maxi,:)=temp; end %%grade column pivot using gauss elimination i=pivot+1:rows num=u(i,pivot)/u(pivot,pivot); u(i,:)=u(i,:)-num*u(pivot,:); l(i,pivot)=num; end pivot=pivot+1; end disp('pa is:'); disp(p*a); disp('lu is:'); disp(l*u); end clarification: since switching rows, looking decompose p (permutation matrix) times a, , not original a had input.
explanation of code:
- first check if matrix invertible, if isn't, stop. if is, pivot (1,1)
- i find largest number in column 1, , switch rows
- grade column 1 using gaussian elimination, turning spot (1,1) zero
- pivot (2,2), find largest number in column 2... rinse, repeat
your code seems work fine can tell, @ least basic examples a=[1,2;3,4] or a=[3,4;1,2]. change function definition to:
function [l,u,p] = newgauss(a) so can output calculated values (much better using disp, shows correct results too). you'll see p*a = l*u. maybe expecting l*u equal a directly? can confirm correct via matlab's lu function:
[l,u,p] = lu(a); l*u p*a permutation matrices orthogonal matrices, p−1 = pt. if want a in code, can do:
p'*l*u similarly, using matlab's lu permutation matrix output, can do:
[l,u,p] = lu(a); p'*l*u (you should use error or warning rather how you're using disp in checking determinant, don't teach that.)
Comments
Post a Comment