martes, 7 de mayo de 2013

Aprendiendo SCILAB - Eliminación de Gauss con pivotación parcial

El siguiente código implementa el algoritmo de eliminación de Gauss con pivotación parcial para resolver el sistema de ecuaciones


Ax = b

// *****************************************************************************
// * FUNCION : gaussPivPar
// * PARAMS : 
// *            A - [n x n] Double
// *            b - [n x 1] Double
// * RETURN :
// *            < struct >
// *                U - [n x n] Double
// *                x - [n x 1] Double
// *
// * Calcula la solucion del sistema de ecuaciones dado por Ax = b mediante el 
// * algoritmo de Gauss con pivotacion parcial. 
// * Esta funcion no solo retorna la solucion sino que tambien retorna la matriz
// * triangular superior que se forma con este algoritmo.
// *****************************************************************************
function rpta = gaussPivPar(A, b)

    [m,n] = size(A)     // Dimesiones de la matriz de entrada
    
    if (m <> n) then    // Comprueba si la matriz es cuadrada
        error("La matriz no es cuadrada.")
    end
    
    // Inicia el algoritmo
    for i = 1:n-1
        // Pivotacion parcial
        [q,p] = max(A(i:n,i))
        p = p+i-1
        A = intercambiarFilas(A, i, p)
        b = intercambiarFilas(b, i, p)
        
        // Triangularizacion
        for j = i+1:n
            r = A(j,i)/A(i,i)
            A(j,:) = A(j,:) - r*A(i,:)
            b(j,:) = b(j,:) - r*b(i,:)
        end
    end
    
    // Sustitucion inversa
    for j = n:-1:1
        suma = 0
        for k = j+1:n
            suma = suma + A(j,k)*x(k)
        end
        x(j) = ( b(j) - suma ) / A(j,j)
    end
    
    rpta = struct("U", A, "x", x)
endfunction


// *****************************************************************************
// * FUNCION : intercambiarFila
// * PARAMS : 
// *            A - [m x n] Double
// *            i - [1 x 1] Integer
// *            j - [1 x 1] Integer
// *
// * Funcion de ayuda que intercambia las filas i y j de la matriz A.
// *****************************************************************************
function rpta = intercambiarFilas(A, i, j)
    temp = A(i,:)
    A(i,:) = A(j,:)
    A(j,:) = temp
    rpta = A
endfunction


// *****************************************************************************
// * EJEMPLO DE EJECUCION
// *
// * -->A = [0 2 1; 1 -2 -3; -1 1 2]
// *  A  =
// *  
// *     0.    2.    1.  
// *     1.  - 2.  - 3.  
// *   - 1.    1.    2.  
// *  
// * -->b = [-8; 0; 3]
// *  b  =
// *  
// *   - 8.  
// *     0.  
// *     3.  
// *  
// * -->sol = gaussPivPar(A, b)
// *  sol  =
// *  
// *    U: [3x3 constant]
// *    x: [3x1 constant]
// *  
// * -->sol.U
// *  ans  =
// *  
// *     1.  - 2.  - 3.   
// *     0.    2.    1.   
// *     0.    0.  - 0.5  
// *  
// * -->sol.x
// *  ans  =
// *  
// *   - 4.  
// *   - 5.  
// *     2. 
// *****************************************************************************

7 comentarios:

  1. Muy bueno compañero.. pero no hace falta ademas definir una funcion b para intercambiar sus filas (pregunto de inocente, no se mucho del tema)

    ResponderEliminar
  2. +10 y favoritos lince, sos groso sabelo

    ResponderEliminar
  3. ¿Como lo uso?
    disculpen la ignorancia

    ResponderEliminar
  4. saben de un blog que explique el metodo de Crout, y su algoritmo?

    ResponderEliminar
  5. Casino Near Bryson City, NC | MapyRO
    Casino Near Bryson City, NC. 대구광역 출장마사지 Address: 391 North 거제 출장마사지 Bryson City 속초 출장마사지 Drive, Bryson City, NC 28906, 성남 출장마사지 United States. Phone Number: (800) 777-7777 정읍 출장샵

    ResponderEliminar