2011-03-03 29 views
6

Estaba intentando implementar Matrix.class para aprender algo de Java. En este momento, tengo algunas dificultades con un método que debería devolver la matriz después de la eliminación gaussiana que se usará para encontrar la inversa de una matriz más adelante.
Esto es lo que se me ocurrió hasta el momento:Eliminación gaussiana en Java

public Matrix gaussianElimination() { 
    Matrix inv = this.clone(); 
    int i = 0; 
    int j = 0; 

    while (i<inv.getHeight() && j<inv.getWidth()) { 
     int pivot = i; 
     for (int k=i+1; k<inv.getHeight(); k++) { 
      if (Math.abs(inv.getArray()[k][j]) > Math.abs(inv.getArray()[pivot][j])) { 
       pivot = k; 
      } 
     } 
     if (inv.getArray()[pivot][j] != 0) { 
      inv = inv.swapRow(i, pivot); 
      double div = inv.getArray()[i][j]; 
      for (double value : inv.getArray()[i]) { 
       value = value/div; 
      } 
      for (int u=i+1; u < inv.getHeight(); u++) { 
       double mult = inv.getArray()[u][j]; 
       for (int l=0; l<inv.getWidth(); l++) { 
        inv.getArray()[u][l] = mult * inv.getArray()[i][l]; 
       } 
      } 
     } 
     j++; 
     i++; 
    } 
    return inv; 
} 

Mientras que la función getArray() devuelve el doble [] [] de la matriz, getHeight() y getWidth() inv.length retorno y inv [ 0] .length respetablemente.

Seguí el pseudocódigo de esta página wikipedia para implementar el algoritmo.
El método devuelve una matriz con la línea del primer elemento de pivote en la parte superior, pero no calcula correctamente las filas inferiores.

Por ejemplo:

A
0,2635522849474877 0,10001114673002853 0,442971040143471
0,2986277338922876 0,7517642579959294 0,09150190333830721
0,8913610667753092 0,8898546572478708 0,25592546060133237

Inv
0,8913610667753092 0,8898546572478708 0,25592546060133237
0,26618513545092265 0,26573527978742995 0,07642644034471581
0.062426597261833985 0.9565941264 0.017923775508624545

Estaría muy agradecido por cualquier ayuda ya que no puedo encontrar una solución. Probablemente haya mezclado un puntero en alguna parte o implementado el algoritmo incorrecto.

+0

Hola, puedes publicar una fuente de tu clase 'Matrix'. –

Respuesta

4

Veo dos problemas.

En estas líneas:

 for (double value : inv.getArray()[i]) { 
      value = value/div; 
     } 

no está modificando los valores almacenados en la matriz; simplemente está modificando el valor de value y luego descartándolo. ¿Quieres algo como:

for (int idx=0; idx<inv.getWidth(); idx++) { 
    inv.getArray()[i,idx] = inv.getArray()[i,idx]/div; 
} 

Además, en esta línea:

inv.getArray()[u][l] = mult * inv.getArray()[i][l]; 

debería cambiar =--=. El algoritmo dice "resta A [u, j] * fila i de la fila u". Simplemente está reemplazando los valores en la fila u con el producto.

+1

Gracias. Me ayudaste mucho. Con estas modificaciones, funciona bien. – anddromedar

Cuestiones relacionadas