package fem2;
import java.lang.Math;
/*Typ quadratische n*n-Matrix,
  Methoden: neumatrix, drucke, lrzerl,lrloes*/

public class matrix
{
  public int n;
  public double[][] a;
  public void neumatrix(int ndim) { // Generiert n*n-Feld
    n = ndim;
    a = new double[n][n];
  }

  public void addelem(int i, int j, double w) { //addiert w zu a[i][j]
    a[i][j] +=w;
  }

  public void drucke() { // Ausdruck Matrix A
    for (int i=0; i<n; i++) {
      for (int j=0; j<n; j++)
        System.out.print(1E-5*Math.round(1E5*a[i][j]) + " ");
      System.out.println();
    } System.out.println();
  }

  public boolean lrzerl() // Gauss-Algorithmus für A -> L*R
  { // ohne Pivotisierung, nur für definite Matrizen!
    int i,j,k;
    double q;
    boolean reg = true;
    for (k=0; (k<n-1)&&reg; k++) { // Durchgänge, Pivotzeile k
      reg = a[k][k]!=0;
      if (!reg) {return reg;} //LR-Zerlegung existiert nicht
      for (i=k+1; i<n; i++) {
        q = a[i][k]/a[k][k]; // Pivotelement
        a[i][k] = q; // als L speichern
        for (j=k+1; j<n; j++) a[i][j] -= q*a[k][j];
      }
    }
    return reg;
  }
  
  public void lrloes(double[] y) // Auflösung A*y <- y mit LR-Zerlegung in A 
  {
    int i,j,k;
    double q;
    for (k=0; k<n-1; k++)  // Durchgänge, Pivotzeile k
    {
      for (i=k+1; i<n; i++) y[i] -= a[i][k]*y[k]; // Elimination rechte Seite
    }
    y[n-1] = y[n-1]/a[n-1][n-1];
    for (i=n-2; i>=0; i--) {
      q = y[i];
      for (j=i+1; j<n; j++) q -= a[i][j]*y[j];
      y[i] = q/a[i][i];
    }
  }

}