jueves, 21 de julio de 2011

CÁLCULO DEL DETERMINANTE

  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