Vous êtes sur la page 1sur 12

function [L U]=flu(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));
L=eye(n);
U=zeros(n);
for j=1:n
U(1,j)=A(1,j);
L(j,1)=A(j,1)/U(1,1);
end
for i=2:n
for j=i:n
s1=0;
for k=1:i-1
s1=s1+L(i,k)*U(k,j);
end
U(i,j)=A(i,j)-s1;

end
for j=2:i-1
s2=0;
for k=1:j-1
s2=s2+L(i,k)*U(k,j);
end
L(i,j)=(A(i,j)-s2)/U(j,j);
end

for j=i:n
s1=0;
for k=1:i-1
s1=s1+L(i,k)*U(k,j);
end
U(i,j)=A(i,j)-s1;

end
end
end
function [Q R]=gransm(A)
n=size(A,1);
m=size(A,2);
u1=A(:,1);
fprintf('u1\n');
disp(u1);
e1=u1/(norm(u1));
fprintf('e1\n');
disp(e1)
Q=zeros(n,m);
Q(:,1)=e1;
for i=2:m
s=0;
for j=2:i
s=s+(((A(:,i))'*Q(:,j-1))/(norm(Q(:,j-1))))*Q(:,j-1);
end
u=A(:,i)-s;
e=(u)/(norm(u));
Q(:,i)=e;
fprintf('u%i\n',i);
disp(u);
fprintf('e%i\n',i)
disp(e);

end
R=Q'*A;
end
function [L D]=facldlt(A)
n=size(A,1);
L=eye(n);
D=zeros(n);
for i=1:n-1
for j=i+1:n
q=0;
for k=1:i-1
q=q+((L(i,k))^2)*D(k,k);
end
D(i,i)=A(i,i)-q;
x=0;
for s=1:i-1
x=x+L(j,s)*L(i,s)*D(s,s);
end
L(j,i)=(A(j,i)-x)/(D(i,i));
end
end
g=0;
for w=1:n-1
g=g+((L(n,w))^2)*D(w,w);
end
D(n,n)=A(n,n)-g;
function [Q R]=hous(A)
m=size(A,1)
A0=A;
Q0=eye(m);
for k=1:m-1
fprintf('\n para K=%i',k);
a=A(:,k);
s=0;
for j=k:m
s=s+a(j)^2;
end
n=sqrt(s)
for j=1:k-1
a(j)=0;
end
x=norm(a(k));
g=sign(a(k))
a(k)=a(k)+g*n
u=(1/sqrt(2*n*(x+n)))*a
H=eye(m)-2*u*u'
A=H*A
Q0=H*Q0;
end
R=A;
Q=Q0';
end
function [Q,R]=givens(A)
[m,n]=size(A);
if m~=n
'matriz no cuadrada'
return
end
A0=A;
i=1;
k=1;
P=eye(n);
while i<n+1
j=i+1;
while j<m+1
if k<10
if A(j,i)==0
fprintf('A%i=\n',k)
disp(A);
else
c(1,1)=A(i,i);
c(1,2)=A(i,j);
c(2,1)=A(j,i);
c(2,2)=A(j,j);
fprintf('\n\n\nc%i=\n',k)
disp(c);
tit=atand(-c(2,1)/c(1,1))
G=eye(n);
G(i,i)=cosd(tit);
G(j,j)=cosd(tit);
G(j,i)=sind(tit);
G(i,j)=-sind(tit);
fprintf('G%i=\n',k)
disp(G);
fprintf('A%i=\n',k)
A=G*A;
disp(A);
end
end
k=k+1;
j=j+1;
P=G*P;
end
i=i+1;
end
q=P;
Q=q';
R=P*A0;
End

function T=trid(A)
%Este programa tridiagonaliza la matriz A
[m,n]=size(A);
if m~=n
'matriz no cuadrada'
return
end
for k=1:n-2
fprintf('\n\nPara K=%i',k);
q=0;
for j=k+1:n
q=q+(A(j,k))^2;
end
q=q
if A(k+1,k)==0
s=1;
else
s=sign(A(k+1,k));
end
a=-s*sqrt(q)
r=sqrt(0.5*a*(a-A(k+1,k)))
for h=1:n
if h<k+1
V(h,1)=0;
else
V(h,1)=A(h,k);
end
V(k+1,1)=A(k+1,k)-a;
end
V=V;
W=(1/(2*r))*V;
H=eye(n)-2*W*W';
A=H*A*H;
end
T=A;
end

function X=JacobiSL(A,B,tol,max)
%
% Datos de entrada
% P es el dato inicial, un vector de orden nx1
% tol es la tolerancia
% max es el numero maximo de iteraciones
%
% Datos de salida
% X es una matriz de orden nx1 con la aproximacion a la
% solucion de AX=B obtenida por el metodo de Jacobi
%
format short
% lee la matriz A, matriz cuadrada invertible de orden n,
% y el vector B, de orden nx1, al ejecutar el fichero
sistemaproblema2tema
n=length(B);
P=zeros(n,1);
c=0;
for k=1:max
% construccion de la siguiente iteracion por el metodo de Jacobi
for j=1:n
X(j)=(B(j)-A(j,[1:j-1,j+1:n])*P([1:j-1,j+1:n]))/A(j,j);
end
disp(X);
% condici¶oon de paro
ea=abs(norm(X'-P));
er=ea/(norm(X)+eps);
if(ea<tol)|(er<tol)
disp('Se alcanzo la tolerancia con exito en la iteracion')
k
disp('y la solucion aproximada es')
X=X';
c=1;
break
else
P=X';
end
end
% no cumplimiento de la condicion de paro
if c==0
disp('El metodo no cumple el criterio de paro propuesto para')
max
disp('iteraciones.')
end

function X=GaussSeidel(A,B,tol,max)
%
% Datos de entrada
% P es el dato inicial, un vector de orden nx1
% tol es la tolerancia
% max es el numero maximo de iteraciones
%
% Datos de salida
% X es una matriz de orden nx1 con la aproximacion a la
% solucion de AX=B obtenida por el metodo de GaussSeidel
%
format short
% lee la matriz A, matriz cuadrada invertible de orden n,
% y el vector B, de orden nx1, al ejecutar el fichero
sistemaproblema2tema2
n=length(B);
P=zeros(n,1);
c=0;
for k=1:max
% construccion de la siguiente iteracion por el metodo de GaussSeidel
for j=1:n
if j==1
X(1)=(B(1)-A(1,2:n)*P(2:n))/A(1,1);
elseif j==n
X(n)=(B(n)-A(n,1:n-1)*(X(1:n-1))')/A(n,n);
else
X(j)=(B(j)-A(j,1:j-1)*(X(1:j-1))'-A(j,j+1:n)*P(j+1:n))/A(j,j);
end
end
% condicion de paro
ea=abs(norm(X'-P));
er=ea/(norm(X)+eps);
if(ea<tol)|(er<tol)
disp('Se alcanzo la tolerancia con exito en la iteracion')
k
disp('y la solucion aproximada es')
X=X';
c=1;
break
else
P=X';
end
disp(X);
end
% no cumplimiento de la condicion de paro
if c==0
disp('El metodo no cumple el criterio de paro propuesto para')
max
disp('iteraciones.')
end
%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


% Modifica GS-> SOR Riccardo BROGLIA 31-12-03

function [x,iter,resid]=SOR(a,b,om,x0,nmax,toll)
[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 ;

Vous aimerez peut-être aussi