// gausspv.sci

// metodo de gauss com pivotamento

function [p, B, x] = gausspv (A, b)

  // importando os metodos necessarios
  getf ("troca_linhas.sci");
  getf ("maior_pivo.sci");
  getf ("subst_retro.sci");
  
  [nlin, ncol] = size(A);
  n = nlin;
  
  // inicializacao do vetor em que
  // anotarei as pivotacoes
  p = zeros(n);
  
  // mprintf ("%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", A, b);
  // mprintf ("\n");
  
  for i = 1:n do
    // fazendo a pivotacao e anotando o pivo
    m = maior_pivo (A,i);
    A = troca_linhas (A, i, m);
    b = troca_linhas (b, i, m);
    
    // mprintf ("%.2f\t%.2f\t%.2f\t%.2f\t %.2f\n", A, b);
    // mprintf ("\n");
    
    p(i) = m;
    
    for j = (i + 1):n do
      // calculando o multiplicador
      l = A(j,i) / A(i,i);
      
      // eliminando a j-esima linha de A, 
      // tomando o cuidado de nao baguncar
      // os multiplicadores
      A(j,i:n) = A(j,i:n) - l * A(i,i:n);
      b(j) = b(j) - l * b(i);
      A(j,i) = l;
      
      // mprintf ("%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", A, b);
      // mprintf ("\n");
      
    end
  end
  
  // NESTE PONTO A MATRIZ 'A' JA ESTA ESCALONADA,
  // E 'b' EH O VETOR LADO DIREITO MODIFICADO.
  
  // resolvendo o sistema escalonado por
  // substituicao retroativa
  x = subst_retro (A, b);
  
  B = A;
endfunction
