El siguiente programa permite el cálculo del determinante de una matriz de cualquier tamaño, este cálculo resulta muy pesado y muy costoso para el ordenador, y los resultados para matrices de ordenes bajos (entorno 10x10) pueden superar el valor de MAXINT y dar valores erróneos.
El método está basado en el desarrollo de Laplace (Nada de Sarrus ni cosas rara...) aplicado a la primera columna de la matriz (importante que sea la primera, puesto que una matriz de 1x1 solo tiene una, y si se pone que se aplique siempre en la segunda daría error), el cual consiste en multiplicar los términos de una columna o fila por su adjunto (no me explayo más, sino queda claro consultar libros de álgebra. J. de Burgos siempre está bien). Para el cálculo del determinante se usa exclusivamente una función recursiva (Es una función que es llamada dentro de ella misma) la cual le otorga una elegante imagen al método, haciéndolo breve y claro (tampoco sé si se podrá hacer de alguna otra manera...).
program Determinante(input,output);
uses crt;
const
maxdim=100;
type
tpContador=0..MAXINT;
tpMatriz=record
dim:tpContador;
vals:array[1..maxdim,1..maxdim] of real
end;
var
matriz:tpMatriz;
procedure PideValores(VAR matriz:tpMatriz);
var
c1,c2:tpContador;
begin
write('Introduzca la dimension de la matriz: ');readln(matriz.dim);
for c1:=1 to matriz.dim do
for c2:=1 to matriz.dim do begin
write('Introduzca el termino (',c1,',',c2,'): ');readln(matriz.vals[c1,c2])
end
end;
procedure DibujaMatriz(matriz:tpMatriz);
var
c1,c2:tpContador;
begin
for c1:=1 to matriz.dim do begin
for c2:=1 to matriz.dim do
write(matriz.vals[c1,c2]:10:2);
writeln
end
end;
function Det(matriz:tpMatriz):real;
var
c1,c2,c3,paso:tpContador;
matrizAux:tpMatriz;
detaux:real;
signo:integer;
begin
detaux:=0;
if matriz.dim>1 then
for c1:=1 to matriz.dim do begin
paso:=0;
matrizAux.dim:=matriz.dim-1;
for c2:=2 to matriz.dim do begin
paso:=0;{Es el desarrolo de Laplace del determinante para la primera columna}
for c3:=1 to matriz.dim do
if c3<>c1 then begin
paso:=paso+1;
{writeln('c1:',c1,' c2:',c2,' c3:',c3);}
matrizAux.vals[paso,c2-1]:=matriz.vals[c3,c2]
end
end;
{DibujaMatriz(matrizAux);writeln;}
if (c1 mod 2)<>1 then signo:=-1 else signo:=1;
detaux:=detaux+matriz.vals[c1,1]*signo*det(matrizAux);
end
else
detaux:=matriz.vals[1,1];
det:=detaux
end;
begin
writeln('Calcula el determiante');
PideValores(matriz);writeln;writeln;writeln('La matriz introducida es: ');writeln;
DibujaMatriz(matriz);writeln;writeln;
{writeln('El determinante es: ');}writeln(Det(matriz));
readln
end.
No hay comentarios:
Publicar un comentario