Está en la página 1de 6

lu_gauss: Algoritmo fact/descomp LU a partir del algortimo de

elminación gaussiana por Kandy Flores

Modificación del algortitmo gauss1 para que en vez de regresar la matriz aumentada, regrese tres matrices:
L, U y D, donde L es una matriz triangular inferior con 1's en la diagonal principal, U es una matriz triangular
superior y D es la matriz que resulta de la transformación de B.

Entradas:

• A: Matriz cuadrada de coeficientes del sistema de ecuaciones.


• B: Vector columna de resultados de cada ecuación.

Salidas:

• x: Vector con los valore para todas las variables del sistema de ecuaciones.

function [L,U,D,x] = lu_gauss(A,B)

[m,~]=size(A);
mB= size(B,1);
eps = 1e-13; %algo es considerado cero si es menor que eps
if mB~=m
error('B tiene %i renglones, pero A tiene %i renglones',mB,m)
end

%Crear Matriz
M = [A,B];

%Protección contra errores en las entradas


if nargin ~= 2
error('Se debe ingresar una matriz cuadrada A y un vector columna B');
%Si se ingresan todos los datos de entrada, elegir un método de solución
else
if size(A,1) ~= size(A,2)
error('Se necesita que la matriz A sea cuadrada')
elseif size(A,1) ~= size(B,1)
error('El número de filas de A no coincide con el de B. Sistema inconsistente');
end
end

disp(newline);
if prod(diag(A)) == 0
error('El determinante de la matriz A es cero, no se puede resolver');
end

%Pivoteo
n = size(A,1);
for k = 1:n
if A(k,k) ~= max(abs(A(:,k)))
[filapivote,~] = find(abs(A) == max(abs(A(:,k))));

1
A([k,filapivote(1)],:) = A([filapivote(1),k],:);
B([k,filapivote(1)]) = B([filapivote(1),k]);
end
end

%Eliminación hacia adelante


U= A; D=B; L= eye(n);
for k = 1:n - 1
for i = k + 1:n
factor = U(i,k)/U(k,k);
L(i,k)=factor;
U(i,:) = U(i,:) - factor*U(k,:);
D(i) = D(i) - factor*D(k);
end
end

%Sustitución hacia atrás


x(n) = D(n)/U(n,n);
for i = n - 1:-1:1
sum = D(i);
for j = i + 1:n
sum = sum - U(i,j)*x(j);
end
x(i) = sum/U(i,i);
end
x = x';

Impresión de resultados

disp('Resultados');
for i = 1:n
fprintf('x%d = %f',i,x(i));
fprintf('\n');
end

2
>> A= [3,6,-2,9;-5,4,5,-6;-3,8,2,-3;-4,10,3,9]

A=

3 6 -2 9

-5 4 5 -6

-3 8 2 -3

-4 10 3 9

>> B=[6;5;3;9]

B=

>> [L,U,D,x]=lu_gauss(A,B)

Resultados

x1 = 2.000000

x2 = 0.500000

x3 = 3.000000

x4 = 0.333333

L=
1.0000 0 0 0

1.3333 1.0000 0 0

1.6667 14.0000 1.0000 0

-1.0000 -21.0000 -2.3333 1.0000

U=

-3.0000 8.0000 2.0000 -3.0000

0 -0.6667 0.3333 13.0000

0 0 -3.0000 -183.0000

0 0 0 -148.0000

D=

3.0000

5.0000

-70.0000

-49.3333

>> L*U =a

a=

-3 8 2 -3

-4 10 3 9

-5 4 5 -6

3 6 -2 9

>> L*x=b
b=

2.0000

0.5000

3.0000

0.3333

>> B=eye(4)

B=

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

>> [L,U,D,x]=lu_gauss(A,B)

Resultados

x1 = 0.479730

x2 = 0.074324

x3 = 0.412162

x4 = -0.006757

L=
1.0000 0 0 0

1.3333 1.0000 0 0

1.6667 14.0000 1.0000 0

-1.0000 -21.0000 -2.3333 1.0000

U=

-3.0000 8.0000 2.0000 -3.0000

0 -0.6667 0.3333 13.0000

0 0 -3.0000 -183.0000

0 0 0 -148.0000

D=

0 0 0 0

0 1 0 0

0 0 1 0

1 0 0 1

x=

0.4797 0.4527 -0.2568 -0.2635

0.0743 0.0068 0.1081 -0.0338

0.4122 0.6284 -0.4459 -0.1419

-0.0068 -0.0158 -0.0856 0.0788

También podría gustarte