Tuesday, October 25, 2005

En diez minutos.....

Bueno, como ya casi no me alcanza el tiempo para nada, hoy, me he decido ha realizar una prueba. Voy a escribir sobre todo lo que me alcance en los diez minutos que tengo libre entre clases. Empezando por decir que estoy solo probando y que puede que diez minutos no de para mucho ..... pero, peor es nada. Son apenas las 9:30am y apenas me siento aqui y sucecede asi ...3 interrupciones ... y un reloj que marca indicando que debo marcharme..... asi que sin mas ni menos me despido porque como a un extranjero en un telefono publico se me terminan los minutos y no puedo hacer mas. Conclusion ... el experimento fracasa ...

Saturday, October 08, 2005

Pompiao con MatLab

Bueno, aqui voy otra vez con mis cosas de geek... Resulta que este semestre me ha tocado llevar un curso de analisis numerico que me encanta. En este curso estamos utilizando MatLab como herramienta de estudio y tengo que decir WoW!!! Estoy super pompiao con el programita, esta super! Bueno, asumo que de esto se habran dado cuenta ya porque ultimamente he publicado casi todo el codigo que he escrito para esa clase y algun otro poco que he hecho por mi cuenta. Bien pues en este caso, les presento mi implementación de la factorizacion LU de una matriz A. No voy a entrar en los detalles de las ventajas y/o desventajas del mismo, ni en los detalles de la matemática detrás, pero si a alguien le interesa saber más sobre el tema, pueden dejar un comentario y puedo añadir más detalles, mas por el momento lo dejo hasta aquí. Espero les agrade.

%*************************************************************************
%Este programa halla la factorizacion LU de una matriz A si es *
%que esta existe o sea, el programa halla una matriz triangular *
%inferior y una matriz triangular superior tal que LU = A. *
% *
% *
%Input: La matriz A a ser factorizada *
% *
%Output: Las matrices L y U y un flag indicando si fue exitosa o no la *
% factorización. *
%*************************************************************************

function [flag,L,U] = LUFac(A)

flag =1; %Bandera indicando que no ha ocurrido ningun error
col=1; %Columna pivote
row=1; %fila pivote
nextRow = row+1;
[A_rowCant,A_colCant] = size(A); %tamano de A
L = eye(A_rowCant,A_colCant);

tic; %Comenzar a contar el tiempo de ejecución
for col=1:(A_colCant)
for rowIndex=1:(A_rowCant-row)
if abs(A(row,col)) < eps
flag = 0;
'Division by zero error'
return;
end
L(nextRow,col) = -(-A(nextRow,col)/A(row,col));
A(nextRow,:) = A(row,:)*(-A(nextRow,col)/A(row,col))+A(nextRow,:);
nextRow = nextRow + 1;
end
row = row+1;
col = col+1;
nextRow = row+1;
end

U=A;
toc;

return

Tuesday, October 04, 2005

Eliminacion Gaussiana CON pivoteo

Aqui les presento una nueva version del codigo de Matlab que ya antes habia publicado que implementa eliminacion Gaussina para resolver sistemas lineales del tipo Ax = b. Esta nueva version no es mas rapida que la anterior, pero el error relativo en los resultados es mucho menor que en la version anterior. El error que se obtiene con este metodo se debe en gran medida a que los resultados fueron obtenidos mediante calculos en representacion finita.

%**********************************************************
%Intercambia dos elementos de un arreglo en una dimension
%Recibe el arreglo y los indices de los elementos a ser intercambiados
%**********************************************************

function array = Swap(array,this,with)
temp = array(this);
array(this) = array(with);
array(with)= temp;
return

---------------------------------------------------------
%*********************************************************
%Implementa la sumatoria desde 'from' hasta 'to'
%Devuelve la suma
%*********************************************************
function [suma] = Sumatoria(from,to, A, x, i,index)

suma = 0;

for k=from:to
suma = suma + A(index(i),k)*x(index(k),1);
end

return

-------------------------------------------------
%**********************************************
%Implements backward substitution over an
%upper triangular matrix
%
%Input: Una matriz A triangular superior y un vector b
%Output: Solution vector
%*********************************************

function [flag,x] = solve_UTSP(A,b,index)
[x_rows,x_cols] = size(b);
[A_rows,A_cols] = size(A);
flag =1;
x = zeros(x_rows,x_cols);

for i=x_rows:-1:1
if abs(A(index(i),i)) < eps
flag = 0;
'Division by zero error'
break;
end
x(index(i),1) = (b(index(i),1)-SumatoriaP(i+1,A_cols,A,x,i,index))/A(index(i),i);
end
return

%************************************************
%Resuelve sistemas lineales utilizando eliminacion
%de Gauss con Pivoteo.
%Input: La matriz A y un vector b
%Output: El vector solucion
%************************************************

function [flag,x] = GE(A,b)

%Para trabajar con la matriz aumentada
A(:,end+1) = b(:,1);

flag =1; %Bandera indicando que no ha ocurrido ningun error
col=1; %Columna pivote
row=1; %inicializar fila pivote
nextRow = row+1;
[b_rowCant,b_colCant] = size(b); %tamano de b
[A_rowCant,A_colCant] = size(A); %tamano de A
index(1:A_rowCant,1) = 1:A_rowCant; %tamano del indice de filas de A

tic; %Comenzar a contar
for col=1:(A_colCant-1)
if abs(A(index(row),col)) < 0.01
[largestPivot,largestPivotIndex] = max(A(index(row):end,col));
largestPivotIndex=largestPivotIndex+(index(row)-1);
index = Swap(index,largestPivotIndex,row);
end

for rowIndex=1:(A_rowCant-row)
if abs(A(index(row),col)) < eps
flag = 0;
'Division by zero error'
return;
end
A(index(nextRow),:) = A(index(row),:)*(-A(index(nextRow),col)/A(index(row),col))+A(index(nextRow),:);
nextRow = nextRow + 1;
end
row = row+1;
col = col+1;
nextRow = row+1;
end

%Para regresar al sistema original
b = A(:,end);
A(:,end) = [];

%Resolver sistema triangular superior
[succesful,x] = solve_UTSP(A,b,index);

x(:,1) = x(index(:),1);
toc;

return

Claro este metodo no lo inventé yo este es solo mi versión del código. Este método fue inventado por Liu Hui y se hace referencia a él en el importantísimo libro chino "Jiuzhang suanshu" o "Los nueve capítulos en el arte de la matemática" que data del 263A.D.. Por otra parte el nombre que conocemos del método, se atribuye al famosísimo matemático alemán, C.F.Gauss, que hizo el mismo popular a finales del siglo 18.

Bueno, pues no se es que es mi opinión que estas cosas tambien son bonitas, tan bonitas como un poema o como una hermosa pintura, pero por alguna razon, no mucha gente se toma el tiempo de sentarse a apreciarlas. Pero, bueno por lo menos quisiera que la mayor cantidad de gente posible se tope al menos con la idea, que sepan al menos que estas cosas existen. Y ya que existen por que no compartirlas? Es como si todos pudieramos tener un Quijote, original, escrita con el mismo puño y letra de Cervantes o una la MonaLisa en la sala de nuestra casa. Quizas no lo parezca pero, si se detienen un segundo a ver lo que hay detras, se daran cuenta de lo inmensamente maravilloso que estas cosas pueden llegar a ser. Remember, "Life moves pretty fast, if you don't stop to look around once in a while, you could miss it".




MP3 Player Turtorial