You are on page 1of 20

function choleski(A) %Este programa factoriza la matriz A simetrica definida %positiva en la forma LL' %donde L es triangular inferior % U es triangular

superior unitaria n=length(A(:,1)); L=zeros(n,n); L(1,1)=sqrt(A(1,1)); L(2:n,1)=A(2:n,1)/L(1,1); for k=2:n L(k,k)=A(k,k)-L(k,1:k-1)*(L(k,1:k-1))'; L(k,k)=sqrt(L(k,k)); for j=k+1:n L(j,k)=(A(j,k)-L(j,1:k-1)*(L(k,1:k-1))')/L(k,k); end end L

function [L U]=crout(A) %Este programa factoriza la matriz A en la forma LU %donde L es triangular inferior % U es triangular superior unitaria n=length(A(:,1)); for k=1:n-1 for i=k+1:n

m(i,k)=A(i,k)/A(k,k); A(i,k)=m(i,k); A(i,n:k+1)=A(i,n:k+1)-m(i,k)*A(k,n:k+1); end end U=triu(A); for k=1:n A(k,k)=1; end L=tril(A); function [L U]=doolittle(A) %Este programa factoriza la matriz A en la forma LU %donde L es triangular inferior unitaria % U es triangular superior n=length(A(:,1)); for k=1:n-1 for i=k+1:n m(i,k)=A(i,k)/A(k,k); A(i,k)=m(i,k); A(i,k+1:n)=A(i,k+1:n)-m(i,k)*A(k,k+1:n); end end U=triu(A); for k=1:n A(k,k)=1; end L=tril(A);

function [L U]=doolittlesolucion(A,b) %Este programa factoriza la matriz A en la forma LU y resuelve el sistema %Ax=b sin intercambio de filas %donde L es triangular inferior unitaria y % U es triangular superior n=length(b); for k=1:n-1 for i=k+1:n m(i,k)=A(i,k)/A(k,k); A(i,k)=m(i,k); A(i,k+1:n)=A(i,k+1:n)-m(i,k)*A(k,k+1:n); end end U=triu(A);% extraemos matriz triangular superior for k=1:n A(k,k)=1;% diagonal principal igual a 1 end L=tril(A);% extraemos matriz triangular inferior % resolver sistema Ly=b y Ux=y (Ax=b) y=progresiva(L,b) x=regresiva(U,y')

function [S,Qf]=itQR(A,tol) A0=A; A1=A+(tol+1)*eye(size(A)); Qf=eye(size(A));

i=1; while(norm(A1-A0,inf)>tol)&(i<=100) [Q,R]=qr(A0); Qf=Qf*Q; A0=R*Q; A1=Q*R; i=i+1; end S=A0;

function [L U]=Will(A) %Este programa factoriza la matriz A en la forma LU %donde L es triangular inferior % U es triangular superior unitaria n=length(A(1,:)); for k=1:n-1 for i=k+1:n m(k,i)=A(k,i)/A(k,k); A(k,i)=m(k,i); A(k+1:n,i)=A(k+1:n,i)-m(k,i)*A(k+1:n,k); end end L=tril(A); for k=1:n A(k,k)=1; end U=triu(A);

function [x,iter,resid]=SOR(a,b,om,x0,nmax,toll) %GSEIDEL Metodo SOR per sistemi lineari % [X,ITER,RESID]=SOR(A,B,OM,X0,NMAX,TOLL) risolve il sistema % lineare A*X=B con il metodo iterativo SOR a % partire da un dato iniziale X0. % % Il metodo si arresta quando la norma 2 del residuo % normalizzato al residuo iniziale e' minore della % tolleranza TOLL o quando viene raggiunto il massimo % numero di iterazioni NMAX. % % La soluzione approssimata viene memorizzata nel % vettore X, mentre in ITER viene riportato il % numero di iterazioni che e' stato necessario per % ottenerla. % In RESID viene memorizzata la storia dei residui. %

% Originale

Saleri Fausto 23-01-01 Riccardo BROGLIA 31-12-03

% Modifica GS-> SOR

[n,n]=size(a); iter = 0; r = b - a * x0; r0 = norm(r); err = norm (r); x = x0';

while err > toll & iter < nmax iter = iter + 1; for i=1:n s = sum(a(i,1:i-1).*x(1:i-1)); s = s + sum(a(i,i+1:end).*x(i+1:end)); xold=x(i); xGS = ( b(i) - s) / a(i,i); x (i) = om*xGS + (1-om)*xold; ( b(i) - s) / a(i,i); end r = b - a * x'; err = norm (r) / r0; resid(iter)=err; end

return

% Este programa resuelve un sistema Ax=b, usando %el metodo iterativo de Jacobi function x= Jacobi(A,b,x0,tol,M) % Datos: x0 vector inicialj % % M numero maximo de iteraciones tol tolerancia para x

n=length(b); for k=1:M for j=1:n x(j)= (b(j)-A(j,[1:j-1,j+1:n]) *x0([1:j-1,j+1:n]))/A(j,j);

end err=abs(norm(x'-x0)); x0=x'; if(err<tol)|(k==M) break end end x=x'

function x=gausseidel(A,b,x0,tol,M) % Datos: x0 vector inicial % % M numero maximo de iteraciones tol tolerancia para x

n=length(b); x(1)=(b(1)-A(1,2:n)*x0(2:n))/A(1,1); for k=1:M for i=1:n x(i)=(b(i)-A(i,1:i-1)*x(1:i-1)'-A(i,i+1:n)*x0(i+1:n))/A(i,i); end err=abs(norm(x'-x0)); x0=x'; if(err<tol)|(k==M) break end end x=x'

function y= gausei(A,B,x,tol) [m,n]=size(A); if m~=n 'matriz no cuadrada' return end for i=1:m if A(i,i)==0 'elementos diagonales nulos' return end end y=x % iteracion for k=1:100 y(1)=(B(1)-A(1,2:n)*x(2:n))/A(1,1); for i=2:n-1 y(i)=(B(i)-A(i,1:i-1)*y(1:i-1)-A(i,i+1:n)*x(i+1:n))/A(i,i); end y(n)=(B(n)-A(n,1:n-1)*y(1:n-1))/A(n,n); if max (abs(y-x))<tol 'n de iteraciones', k return end x=y; end '100 iteraciones no han sido suficientes'

unction [x,iter,resid]=SOR(a,b,om,x0,nmax,toll) %GSEIDEL Metodo SOR per sistemi lineari % [X,ITER,RESID]=SOR(A,B,OM,X0,NMAX,TOLL) risolve il sistema % lineare A*X=B con il metodo iterativo SOR a % partire da un dato iniziale X0. % % Il metodo si arresta quando la norma 2 del residuo % normalizzato al residuo iniziale e' minore della % tolleranza TOLL o quando viene raggiunto il massimo % numero di iterazioni NMAX. % % La soluzione approssimata viene memorizzata nel % vettore X, mentre in ITER viene riportato il % numero di iterazioni che e' stato necessario per % ottenerla. % In RESID viene memorizzata la storia dei residui. %

% Originale

Saleri Fausto 23-01-01 Riccardo BROGLIA 31-12-03

% Modifica GS-> SOR

[n,n]=size(a); iter = 0; r = b - a * x0; r0 = norm(r); err = norm (r); x = x0';

while err > toll & iter < nmax iter = iter + 1; for i=1:n s = sum(a(i,1:i-1).*x(1:i-1)); s = s + sum(a(i,i+1:end).*x(i+1:end)); xold=x(i); xGS = ( b(i) - s) / a(i,i); x (i) = om*xGS + (1-om)*xold; ( b(i) - s) / a(i,i); end r = b - a * x'; err = norm (r) / r0; resid(iter)=err; end

return

function [P,R]=eigJacobi(A,tol) if A==A' n=length(A(:,1)); R=eye(n); P=A; l=1; while norm(P-diag(diag(P)))>tol&(l<=100) for i=1:n for j=i+1:n

if P(j,j)~=P(i,i) theta=(P(j,j)-P(i,i))/(2*P(i,j)); t=sign(theta)/(abs(theta)+sqrt(theta*theta+1)); c=1/sqrt(t*t+1); s=c*t; else c=sqrt(2)/2; s=c; end aux=eye(n); aux(i,i)=c; aux(j,j)=c; aux(i,j)=s; aux(j,i)=-s; P=aux'*P*aux; R=R*aux; end end l=l+1; end else error('La matriz debe ser simetrica.'); end

function [lambda,V]=invpow(A,X,alpha,epsilon,max1) % % % % % - A es una matriz de orden nxn - X es el vector inicial - alpha es la traslacion - epsilon es la tolerancia - max1 es el numero maximo de iteraciones

% Resultados % % - lambda es el autovalor que esta mas cerca de alpha - V es el autovector asociado a lambda

% Valores iniciales de la matriz A-alpha I y de los parametros [n,n]=size(A); A=A-alpha*eye(n); lambda=0; cnt=0; err=1; state=1; [L,U,P]=lu(A); while((cnt<=max1)&(state==1)) %Resolucion del sistemaAY=X Y=L\(P*X); Y=U\Y; %Normalizacion de Y [m,j]=max(abs(Y)); c1=m; dc=abs(lambda-c1); Y=(1/c1)*Y; %Actualizacion de X y de lambda y criterio de convergencia

dv=norm(X-Y); err=max(dc,dv); X=Y; lambda=c1; state=0; if(err>epsilon) state=1; end cnt=cnt+1; end lambda=alpha+1/c1; V=X;

function [S,Qf]=itQR(A,tol) A0=A; A1=A+(tol+1)*eye(size(A)); Qf=eye(size(A)); i=1; while(norm(A1-A0,inf)>tol)&(i<=100) [Q,R]=qr(A0); Qf=Qf*Q; A0=R*Q; A1=Q*R; i=i+1; end S=A0;

function T=house(A) %Dato % A es una matriz simetrica de orden n x n %Resultado % T es una matriz tridiagonal [n,n]=size(A); for k=1;n-2; %construccion de W s=norm(A(k+1:n,k)); if (A(k+1,k)<0) s=-s; end r=sqrt(2*s*(A(k+1,k)+s)); W(1:k)=zeros(1,k); W(k+1)=(A(k+1,k)+s)/r; W(k+2:n)=A(k+2:n,k)'/r; %construccion de V V(1:k)=zeros(1,k); V(k+1:n)=A(k+1:n,k+1:n)*W(k+1:n)'; %construccion de Q c=W(k+1:n)*V(k+1:n)'; Q(1:k)=zeros(1,k); Q(k+1:n)=V(k+1:n)-c*W(k+1:n); %calculo de la matriz T A(k+2:n,k)=zeros(n-k-1,1); A(k,k+2:n)=zeros(1,n-k-1); A(k+1,k)=-s;

A(k,k+1)=-s; A(k+1:n,k+1:n)=A(k+1:n,k+1:n)-2*W(k+1:n)'*Q(k+1:n)-2*Q(k+1:n)'*W(k+1:n); end T=A;

function [lambda,v]=potencia(A,v,tol) i=1; err=tol+1; while (i<=100)&(tol<=err) v=v/norm(v,inf); y= A*v; lambda=norm(y,inf); if (lambda==0) break; end vs=y/lambda; err=norm(v-vs,inf); i=i+1; v=vs; end

function [lambda,v]=potenciainv(A,v,tol) i=1; err=tol+1; while (i<=100)&(tol<=err) v=v/norm(v,inf); y=resuelve(A,v);

lambda=norm(y,inf); if (lambda==0) error('El valor propio es cero o muy cercano a cero') break; end vs=y/lambda; err=norm(v-vs,inf); i=i+1; v=vs; end lambda=1/lambda;

function [lambda,V]=power1(A,X,epsilon,max1)

%Datos % % % % -A es una matriz de orden n x n -X es el vector inicial de orden n x 1 -epsilon es la tolerancia - max1 es el numero maximo de iteraciones

% Resultados % % -lambda es el autovalor dominante - V es el autovector dominante

% Inicianilizacion de los parametros lambda=0; cnt=0;

err=1; state=1;

while ((cnt<=max1)&(state==1)) Y=A*X; % Normalizacion de Y [m j]=max(abs(Y)); c1=m; dc=abs(lambda-c1); Y=(1/c1)*Y; % Actualizacion de X y de lambda y criterio de convergencia dv=norm(X-Y); err=max(dc,dv); X=Y; lambda=c1; state=0; if(err>epsilon) state=1; end cnt=cnt+1; end V=X;

function [S,Qf]=itQR(A,tol) A0=A; A1=A+(tol+1)*eye(size(A)); Qf=eye(size(A));

i=1; while(norm(A1-A0,inf)>tol)&(i<=100) [Q,R]=qr(A0); Qf=Qf*Q; A0=R*Q; A1=Q*R; i=i+1; end S=A0;

function [Q,R] = houseqr(A) %HOUSEQR Factorizacion QR de una matriz A usando matrices %Householder %[Q,R] = houseqr(A) produce an ortogonal matriz Q %y una matriz triangular superior R del mismo tamao que A %con ceros debajo de la diagonal A tal que A = QR. %Este program llama a los programas HOUSECERO y HOUSEMULT. %input : Matriz A %output : Matrices Q y R [m,n] = size(A); S= min(n,m-1); Q = eye(m,m); for k = 1 : S [x,sigma] = housecero(A(k:m,k)); Q(1:m,k:m) = housemult(Q(1:m,k:m),x); A(k,k) = sigma ; s1 = size(x);

A(k+1:m,k) = x(2:s1); v(k) = x(1); beta = 2/(x'*x); for j = k+1:n s = 0; s = s + x(1:m-k+1)' * A(k:m,j); s = beta * s; A(k:m,j) = A(k:m,j) - s * x(1:m-k+1); end; end; R = triu(A); End

function [lambda,V,cnt]= ItInvRayleigh(A,x,tol,max1) % Metodo de la iteracion inversa if nargin<3 tol=0.000001; max1=10; end lambda=0;cnt=0;err=1;n=length(A);x=rand(n,1); format long while err>tol sigma=(x'*A*x)/(x'*x); y=(A-sigma*eye(n))\x; y=y/norm(y,inf); err=norm(abs(y-x),inf); x=y; cnt=cnt+1;

end y=A*x; [xk k]=max(abs(x)); lambda=y(k)/x(k); V=x;

You might also like