Eliminacion Gaussiana sin pivoteo
Saludos, aquí quería compartir con aquellos de ustedes que se interesan por el algebra lineal, un código que escribí en Matlab ver.7 que resuelve sistemas lineales de la forma Ax = b, donde A es una matriz cudrada con coeficientes en R.
Implementación de funcion sumatoria
function [suma] = Sumatoria(from,to, A, x, i)
suma = 0;
for k=from:to
suma = suma + A(i,k)*x(k,1);
end
return
*********************************************
Implementación de “Backward substitution”
function [flag,x] = solve_UTS(A,b)
[x_rows,x_cols] = size(b);
[A_rows,A_cols] = size(A);
flag =0; %Inica que no ha ocurrido ningun error
x = zeros(x_rows,x_cols);
for i=x_rows:-1:1
if abs(A(i,i))
break;
end
x(i,1) = (b(i,1)-Sumatoria(i+1,A_cols,A,x,i))/A(i,i);
end
return
******************************************************
Implementación de un solucionador de sistemas lineales de la forma Ax = b utilizando el método de eliminación Gaussiana sin pivoteo.
function [flag,x] = GE(A,b)
%Para trabajar con la matriz aumentada
A(:,end+1) = b(:,1);
flag =0; %Indica que no ha ocurrido ningun error
col=1; %Columna en que se comenzara
row=1; %fila en la que se comenzara
deltaRow=1; %Distancia entre filas
[b_rowCant,b_colCant] = size(b); %tamano de b
[A_rowCant,A_colCant] = size(A); %tamano de A
nextRow = row+deltaRow;
tic;
for col=1:(A_colCant-1)
for rowIndex=1:(A_rowCant-row)
if abs(A(row,col))
return;
end
A(nextRow,:) = A(row,:)*(-A(nextRow,col)/A(row,col))+A(nextRow,:);
nextRow = nextRow + 1;
end
row = row+1;
col = col+1;
nextRow = row+deltaRow;
end
%Para regresar al sistema original
b = A(:,end);
A(:,end) = [];
[UTS_flag,x] = solve_UTS(A,b);
toc;
return
Listo, interesante verdad pero muy ineficiente, este metodo el costo de llevar a cabo este metodo esta en el orden de n cubo.


0 Comments:
Post a Comment
<< Home