# Finde den Fehler nicht.



## user126 (17. Jan 2016)

hier die aufgabe . ich soll s berechnen. Jedoch ist irgendwo ein fehler welcher das ergebnis verfälscht . (das programm selbst ist fehlerfrei lauffähig).








```
import java.util.Locale;
import java.util.Scanner;

public class LinAusgleich {

   static double[] vektoreinlesen() {
     Locale.setDefault (Locale.US);
     Scanner sc = new Scanner (System.in);
     int dim = sc.nextInt();
     double[] vek = new double [dim];
     for (int i=0; i<dim; ++i)
       vek = sc.nextDouble();
     return vek;
   }

   public static double[][] matrixprodukt(double[][] m1, double[][] m2) {
     double[][] ergebnismatrix = null;
     int zeilenm1 = m1.length;
     int spaltenm1 = m1[0].length;
     int spalenm2 = m2[0].length;

     ergebnismatrix = new double[zeilenm1][spalenm2];
     for (int i = 0; i < zeilenm1; i++) {
       for (int j = 0; j < spalenm2; j++) {
         ergebnismatrix[j] = 0;
         for (int k = 0; k < spaltenm1; k++) {
           ergebnismatrix[j] += m1[k] * m2[k][j];
         }
       }
     }
     return ergebnismatrix;
   }

   public static double[][] multiply(double[][] A, double[][] B) {
     int mA = A.length;
     int nA = A[0].length;
     int mB = B.length;
     int nB = B[0].length;
     if (nA != mB) throw new RuntimeException("Illegal matrix dimensions.");
     double[][] C = new double[mA][nB];
     for (int i = 0; i < mA; i++)
       for (int j = 0; j < nB; j++)
         for (int k = 0; k < nA; k++)
           C[j] += A[k] * B[k][j];
     return C;
   }
     
   public static double[] multiplyvek(double[][] A, double[] x) {
     int m = A.length;
     int n = A[0].length;
     if (x.length != n) throw new RuntimeException("Illegal matrix dimensions.");
     double[] y = new double[m];
     for (int i = 0; i < m; i++)
       for (int j = 0; j < n; j++)
         y += A[j] * x[j];
     return y;
   }

   public static double [] matrixvektorprodukt (double [][] matrix, double [] vektor){
     double[] newVektor = {0,0,0};
     for(int i = 0; i < matrix.length ; i++){
       for (int j = 0; j < matrix[0].length; j++){
         newVektor += matrix [j] * vektor;
       }
     }
     return newVektor;
   }

   public void matrixinvers() {
   }

   public static void main(String[] args) {
     System.out.println("Bitte Vektor x eingeben: zuerst die Dimension, dann die Komponenten");
     double [] x = vektoreinlesen();
     System.out.println("Bitte Vektor y eingeben: zuerst die Dimension, dann die Komponenten");
     double [] y = vektoreinlesen();
     double [][] matrixa = new double[x.length][2];  // Matrix A

     for(int i=0 ;i < x.length; ++i) {
       matrixa [ i ] [ 0 ] =  1 ;
     }
     for(int i=0 ;i < x.length; ++i) {
       matrixa [ i ] [1] =  x ;
     }
     
     double [][] matrixat = new double[2][x.length];
     for (int i=0; i<x.length; i++) {  // Transpo
       for (int j=0; j<2; j++) {
         matrixat[j] = matrixa[j];
       }
     }

     double[][] atmala = multiply(matrixat , matrixa);
     double [][] inverse = new double [2][2];
     inverse [ 0 ] [0] =  atmala[1][1]* (1/(atmala[0][0]*atmala[1][1]-atmala[0][1]*atmala[1][0])) ;  // Inverse
     inverse [ 0 ] [1] =  atmala[0][1]* (-1*(1/(atmala[0][0]*atmala[1][1]-atmala[0][1]*atmala[1][0])));
     inverse [ 1 ] [0] =  atmala[1][0]* (-1*(1/(atmala[0][0]*atmala[1][1]-atmala[0][1]*atmala[1][0])));
     inverse [ 1 ] [1] =  atmala[0][0]* (1/(atmala[0][0]*atmala[1][1]-atmala[0][1]*atmala[1][0]));

     for(int j=0 ;j < 2; ++j) {
       for(int i=0 ;j < 2; ++j) {
         System.out.print(""+inverse[j]+" , ");
       }  
     }

     double[] mvprodukt = multiplyvek(matrixat , y);   
     double[] s = multiplyvek(inverse , mvprodukt);
     double[][] zwischen = multiply(inverse , matrixat);
     double[] ss = multiplyvek(zwischen , y);

     for(int j=0 ;j < 2; ++j) {
       System.out.print(""+ss[ j ]+" , ");
     }  
     System.out.println("  ");
     System.out.println("  ");

     for(int j=0 ;j < 2; ++j) {
       System.out.print(""+s[ j ]+" , ");
     }  
   }
}
```


----------



## knilch (17. Jan 2016)

Hi,
die Methode

```
public static double[][] matrixprodukt(double[][] m1, double[][] m2) {
    double[][] ergebnismatrix = null;


    int zeilenm1 = m1.length;
    int spaltenm1 = m1[0].length;
    int spalenm2 = m2[0].length;

    ergebnismatrix = new double[zeilenm1][spalenm2];

    for (int i = 0; i < zeilenm1; i++) {
        for (int j = 0; j < spalenm2; j++) {
            ergebnismatrix[j] = 0;
            for (int k = 0; k < spaltenm1; k++) {
                ergebnismatrix[j] += m1[k] * m2[k][j];
            }
        }
    }
    return ergebnismatrix;
}
```
für die Berechnung vom Matrix-Produkt ist nicht so der Hit... Schau mal unter https://de.wikipedia.org/wiki/Matrizenmultiplikation nach, wie das Matrix-Produkt gebildet wird...
Hier in Psedocode:

```
function matmult(A,B,l,m,n)
  C = zeroes(l,n)                           // Ergebnismatrix C mit Nullen initialisieren
  for i = 1 to l                            // Schleife über die Zeilen von C
    for k = 1 to n                          // Schleife über die Spalten von C
      for j = 1 to m                        // Schleife über die Spalten von A / Zeilen von B
        C(i,k) = C(i,k) + A(i,j) * B(j,k)   // Bildung der Produktsumme
      end
    end
  end
  return C
```


----------



## JStein52 (17. Jan 2016)

@knilch :  Ich glaube sein Code war etwas anders als du denkst aber dadurch dass er keine Code-tags verwendet hat ist immer der Index _i  verloren gegangen !_


----------



## user126 (17. Jan 2016)

ich habe die methode zur matrix multiplikation getested und es kam das richtige ergebnis heraus daran kann es also eigentlich nicht liegen


----------



## JStein52 (17. Jan 2016)

user126 hat gesagt.:


> das programm selbst ist fehlerfrei lauffähig


Das ist ein Widerspruch zu der Aussage dass ein Fehler drinnen ist. Was genau ist denn der Fehler ? Was hast du schon getestet ?


----------



## user126 (17. Jan 2016)

das programm soll S berechnen  diese berechnung von s enthält aber irgendwo einen fehler.
jedoch weiß ich nicht wo.
(Dass es einen fehler gibt weiß ich da ich eine mustertestwert zum vergleich habe )


----------



## JStein52 (18. Jan 2016)

Bist du deine main schon mal schrittweise durchgegangen ? Bis wohin ist noch alles richtig ? Und inzwischen hat zwar jemand freundlicherweise den Code in Code-Tags gesetzt aber man kann trotzdem nicht so viel dazu sagen weil das i in eckigen Klammern überall verloren gegangen ist !.

Edit: gezielte Frage: stimmt zum Beispiel die inverse noch ?


----------

