Você está na página 1de 8

Rutina para el refinamiento de la inversin de matrices de cualquier rango

con la precisin deseada (revisado y ampliado)

Carlos R. Gonzlez Gonzlez (carlosg@uci.cu; cgonzales@icmf.inf.cu) ICIMAF,


CITMA.

RESUMEN

El cdigo se basa en un algoritmo de aproximaciones sucesivas por


iteraciones, el cual permite de forma muy eficiente encontrar la inversa de una
matriz cuadrada de cualquier rango y con la exactitud que se quiera. El cdigo
fue desarrollado en Delphi 7.0, pero se usaron los componentes CLX, por lo
cual, no sera difcil transformarlo a Kylix 3 y poderlo usar como componente de
programas sobre Linux.

Introduccin.

Para la solucin de sistemas de ecuaciones lineales existen mtodos directos


como el de Gauss; mtodos iterativos como el de Jacobi o el de Seidel, o
mtodos de Montecarlo. En muchos de estos casos la convergencia de la
solucin se complica debido al mal condicionamiento de los sistemas de
ecuaciones, y entonces se debe acudir a las estrategias de pivote, o a mtodos
que mejoran la eficiencia o la precisin de los clculos para algunos tipos de
matrices de diagonal predominante, tridiagonales, etc. 1,2,3,4,5,6,7,8
Por estas razones, resulta muy conveniente disponer de un mtodo eficiente y
exacto de invertir matrices cuadradas de cualquier rango.

Algoritmo del componente de refinamiento de matrices

El procedimiento parte de una matriz cuadrada A que no tiene que poseer


ningn requerimiento especial, a la cual se le ha determinado su inversa A-1
por algn mtodo sencillo y rpido, sin muchos requerimientos de exactitud.
Los clculos consisten entonces en la realizacin de un ciclo repetido de
refinamiento en el cual se determina primeramente la matriz error R como la
diferencia entre el duplo de la matriz unitaria I y el producto de la matriz original
por su inversa. El nmero RMAX es la norma de la matriz R e indica la
exactitud de la determinacin de la inversa.
Entonces se calcula la primera aproximacin de la matriz inversa refinada como
el producto de la inversa de A por la suma de la matriz error R y la matriz
unitaria I.
Este procedimiento se repite tomando como matriz A-1 a la matriz inversa
refinada, hasta tanto el nmero RMAX sea tan pequeo como se quiera.
A continuacin se expresa el algoritmo en forma de seudocdigo, y la seccin
de cdigos de clculo en (Delphi7/Kylix 3) con los cules fueron refinadas las
inversas de numerosas matrices.
RMAX = 1
While RMAX > do
R = 2*I - A A -1
RMAX =
Rij

max

DN = A -1 R
A -1 = DN

El cdigo de programa fue realizado a manera de prueba para el refinamiento


de matrices de orden 10 y algunos elementos visuales y de control para seguir
cmodamente la ejecucin de los distintos pasos de los clculos. Tambin se
estableci en el mismo un lmite de exactitud arbitrario RMAX= 0,000001 que
en la prctica debe ser fijado por el usuario en el caso de la aplicacin
concreta.

procedure Refinar;
var
CNT: string;
E: byte;
i,j,k,C: integer;
RMAX,SUM: double;
R,MRef: array[0..9] of array[0..9] of double;
begin
RMAX:= 1;
C:= 0;
while RMAX> 0.000001 do
begin
RMAX:= 0;
for i:= 0 to 9 do
begin
for j:= 0 to 9 do
begin
if i=j then E:=1 else E:= 0;
SUM:= 0;
for k:= 0 to 9 do SUM:= SUM + M[i,k]*MI[k,j];
R[i,j]:= 2*E- SUM;
if abs(R[i,j]-E)> RMAX then RMAX:= Abs(R[i,j] - E)
end;
end;
for i:= 0 to 9 do
begin
for j:= 0 to 9 do
begin
MRef[i,j]:= 0;
for k:= 0 to 9 do MRef[i,j]:= MRef[i,j] + MI[i,k]*R[k,j];
end;
end;
for i:= 0 to 9 do
begin
for j:= 0 to 9 do MI[i,j]:= MRef[i,j];
end;
inc(C);
MainForm.LabeledEdit1.Text:= FloatToStr(RMAX);
MainForm.LabeledEdit2.Text:= IntToStr(C);
for i:= 0 to 9 do for j:= 0 to 9 do
begin
MainForm.StringGrid2.Cells[i+1,j+1]:= FloatToStr(MRef[i,j]);
end;
CNT:= InputBox('Contine', 'Prompt', 'Contine');
end;
end;

El procedimiento fue probado con xito para distintos tipos de matrices 10 x 10


tanto de diagonal predominante, como en casos de mal condicionamiento
donde las filas y columnas se diferencian muy poco entre s. En todos los
casos la primera aproximacin de la matriz inversa fue calculada por el mtodo
de Gauss con precisin simple. En estos casos ensayados, la convergencia del
refinamiento fue extraordinariamente rpida, logrndose valores de la norma de
la matriz refinada de hasta 10-17 en solamente una o dos iteraciones.

Experimentos realizados con cdigos de MATLAB en matrices aleatorias


de tamaos 100x100 y 200x200

Los cdigos para el programa en MATLAB se elaboraron teniendo en cuanta la


posibilidad de importar los datos desde una tabla de EXCEL asociada, o
trabajar con una matriz aleatoria de dimensiones hasta 256x256 creada por el
propio programa. A continuacin los cdigos del programa principal:

%Program for finding the inverse of a given matrix in two steps


%Opening of the matrix to be inverted
A = xlsread('MatrizA.xls');
%Alternative creation of a random matrix
prompt = {'Enter "Y" for a random matrix:'};
dlg_title = 'Input for random matrix';
num_lines = 1;
defaultanswer = {'N'};
answer = inputdlg(prompt,dlg_title,num_lines,defaultanswer);
resp= char(answer);
switch (resp)
case 'Y'
SM= uint16(input('Desired size of the random matrix: '));
A=rand(SM);
if SM <= 26
seq= 1;
NL1= SM;
NL2= 0;
NL3= 0;
elseif SM <= 676
seq= 2;
NL1= idivide(SM,26,'fix');
NL2= SM- NL1*26;
NL3= 0;
elseif SM <= 2000
seq= 3;
NL1= idivide(SM,676,'fix');
NL2= idivide(SM- NL1*676,26,'fix');
NL3= SM- NL1*676- NL2*26;
else
error('The size of the matrix is over 256');
end
ch1= fSmToExcel(NL1);
ch2= fSmToExcel(NL2);
ch3= fSmToExcel(NL3);
str = int2str(SM);
s = ['A1:',ch1,ch2,ch3,str];
xlswrite('MatrizA.xls',A,s);
case 'N'
disp('The imported matrix is used')
otherwise
disp('The imported matrix is used')
end
mo = size(A,1);
disp('Matrix size: ');
disp(mo);
B=eye(mo);
C= [A B]; % creating the amplied matrix
% Now the rough inverse is calculated by Gauss-Jordan method
errperm=input('Maximal permisible absolute error: ');
tic
for i= 1:(mo-1);
for k=i+1:mo;
fac=C(k,i)/C(i,i);
for l= 1:2*mo;
C(k,l)=C(k,l)-fac*C(i,l);
end
end
end
X = C;
l=2*mo;
for l=1:mo;
X(:, 1) = [];
end
for j=1:mo;
i=mo;
while i~=0
for k=i+1:mo;
if (i~=mo)
X(i,j)=X(i,j)-C(i,k)*X(k,j);
end;
end
X(i,j)=X(i,j)/C(i,i);
i=i-1;
end
end
%The matrix X is the rough inverse of A; now starts the refination
RMAX= 1;
it= 0;
while RMAX> errperm
B=A*X;
R= 2*eye(mo)-B;
RMAX= abs(1-norm(R,1));
XC=X*R;
X=XC;
it= it+1;
end
TC= toc;
Nrd=norm(A,1);
Nri=norm(X,1);
cond= Nrd*Nri;
disp('Inverse matrix: ');
disp(X);
disp('Number of iterations: ');
disp(it);
disp('Error of the inverse matrix: ');
disp(RMAX);
disp('Time consumption for running (s): ');
disp(TC);
disp('Conditioning of matrix A: ');
disp(cond);

El programa precisa de una funcin fSmToExcel cuyo cdigo es el siguiente:

function [ch] = fSmToExcel( SMA )


%UNTITLED2 Function for convertion of an integer number to EXCEL
column id
switch (SMA)
case 0
ch='';
case 1
ch='A';
case 2
ch='B';
case 3
ch='C';
case 4
ch='D';
case 5
ch='E';
case 6
ch='F';
case 7
ch='G';
case 8
ch='H';
case 9
ch='I';
case 10
ch='J';
case 11
ch='K';
case 12
ch='L';
case 13
ch='M';
case 14
ch='N';
case 15
ch='O';
case 16
ch='P';
case 17
ch='Q';
case 18
ch='R';
case 19
ch='S';
case 20
ch='T';
case 21
ch='U';
case 22
ch='V';
case 23
ch='W';
case 24
ch='X';
case 25
ch='Y';
case 26
ch='Z';
end

Es posible que el programa no cree el fichero de MATLAB MatrizA.xls por s


mismo, por lo cual el usuario lo debe crear por su cuenta la primera vez que
corra el programa, con datos cualquiera (pueden ser ceros)

Experimento 1. Corrida de matrices aleatorias de dimensin 100x100


estableciendo un error mximo de 1.10-11.

No. Iteraciones Error obtenido Tiempo corrida (s) Condicionamiento


1 2 2,4.10-13 0,05 4820
2 2 2,7.10-13 0,05 7697
3 2 63.10-13 0,06 121730
4 2 3,2.10-13 0,06 4701
5 2 6,0.10-13 0,06 11797

Experimento 2. Corrida de matrices aleatorias de dimensin 200x200


estableciendo un error mximo de 1.10-11.

No. Iteraciones Error obtenido Tiempo corrida (s) Condicionamiento


1 2 2,3.10-12 0,49 4820
2 2 2,0.10-12 0,31 7697
3 2 2,6.10-12 0,32 121730
4 2 0,4.10-12 0,06 4701
5 2 1,2.10-12 0,32 11797

Puede notarse que el programa, que incluye tanto el tiempo para obtener la
matriz inversa gruesa por el mtodo de Gauss-Jordan sin estrategia de
pivoteo, y el mtodo de refinamiento reivindicado en el presente trabajo, corre
muy rpidamente, (menos de una dcima de segundo en las matrices 100x100,
y de algunas dcimas de segundo en las de 200x200) El error de la matriz
inversa, obtenido mediante la norma de la matriz A*A -1 en un orden de
magnitud al aumentar la dimensin de las matrices , pero siempre se mantiene
muy bajo con solamente 2 iteraciones de refinamiento.
1
lvarez, Manuel Blanco, Alfredo Guerra Hernndez y Rogelio Lau Fernndez.
Matemtica numrica, tomo 1 y 2. Flix Varela, La Habana, 2da edicin, 2007

2
Conte, S. D. y Carl de Boor. ELEMENTARY NUMERICAL ANALYSIS An Algorithmic Approach. McGraw-Hill
Book Company, 3ra edicin, 1980.
3
Higham, Nicholas J. Accuracy and Stability of Numerical Algorithms. SIAM, 1996

4
Moler, Cleve. Numerical Computing with MATLAB. The MathWorks, 2004
5
Otae, Eugenio. Lmites de los mtodos numricos. 191. Centro internacional de Mtodos Numricos en ingeniera,
Universidad Politcnica de Catalua, Barcelona, Espaa, 2000

6
Quarteroni, Alfio y Fausto Saleri. Clculo Cientfico con MATLAB y Octave. Springer, 2006
7
Young, Won Yang, Wenwu Cao, Tae-Sang Cung y John Morris. Applied Numerical Methods Using MATLAB.
JOHN WILEY & SONS,INC., 2005.

8
Garca, Javier Jaln, Jos Ignacio Rodrguez y Jess Vidal. Aprenda MatLab 7.0 como si estuviera en primero.
Escuela Tcnica Superior de Ingenieros Industriales, Universidad Politcnica de Madrid, Madrid, 2005.

Você também pode gostar