Java gaußalgorithmus

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
327
hi

ich habe ein kleines problem damit, den algorithmus in java zu implementieren.
die matrix auf stufenform zu bringen funktioniert schonmal, nur mit der berechnung der lösungen tue ich mir schwer. habe versucht, es rekursiv zu lösen, aber ich glaube, ich hab da irgendwo nen denkfehler drin.
die methode liefert nur die lösung für die letzte variable

hier mal mein code
Code:
/* m ist matrix in stufenform, r sind die ergebnisse für die zeilen in m, dimension ist die größe der eigngegeben matrix.
das gesamte gleichungssystem sieht also so aus
m00   m01   m02   m03   r0
0        m11   m12   m13   r1
0          0      m22   m23   r2			
0          0          0    m33   r3

die methode soll ein array mit den Lösungen des gleichungssystems zurückgeben
*/
	public double[] solve(double[][] m,double[] r, int dimension){
		if (dimension == 1){
			double[] f= new double[1];
			f[0] = r[dimension-1]/m[dimension-1][dimension-1];
			return f ;
		}	
		else{
			double[][] a = new double[dimension-1][dimension-1];
			double[] b = new double[dimension-1];
			for(int i =1;i<dimension;i++){
				for(int j =1;j<dimension;j++){
					a[i-1][j-1] = m[i][j];
				}	
				b[i-1]=r[i];	
			}
			return solve(a,b,dimension-1);
		}
	}

erkennt jemand den fehler bzw hat jemand eine idee, wie man das iterativ lösen kann?
 
Also mir fällt auf den ersten Blick auf, dass du nie mehr als nur einen Wert zurücklieferst...

Also die Idee is an sich glaub nich verkehrt...
aber wenn du aus solve zurückkommst in Zeile 25 könntest du diese (Teil)ergebnisse in die Matrix einsetzen, umstellen um jeweils die nächste Variable zu lösen...

also beispiel
du bekommst am ende der rekursion raus r3 = 7
das in die matrix eingesetzt lässt dich r2 ermitteln.. mit r3 und r2 kannst du r1 bestimmen, und dann schließlich aus den dreien dann r0

du lieferst aber nur r3 zurück, du müsstest in 25 immer ein Array der Größe der Dimension zurückliefern...
 
Zuletzt bearbeitet:
Iterativ kannst du das folgedermaßen lösen:

Code:
public double[] solve(double[][] m,double[] r, int dimension){
    double [] f = new double[dimension];

    f[dimension-1] = r[dimension -1] / m[dimension-1][dimension-1];
    for(int i = n-2; i >= 0; i--) {
        double h = 0;
        for(int j = i+1; i < dimension; j++) {
            h += m[i][j] * f[j];
        }
        f[i] = (r[i] - h) / m[i][i];
    }
    return f;
}

Der "Trick" dabei ist, das ganze von unter her anzufangen. Dort kannst du ja (wie in deinem Basisfall für dimension=1) das letzte Element der Lösung berechnen. Das Ergebnis kannst du in die Zeile drüber einsetzen und nach f auflösen (das Einsetzen wird durch die Berechnung von h durchgeführt und das Auflösen durch die Zeile nach der inneren Schleife). Das setzt du so fort, bis du in der ersten Zeile angekommen bist.

Viele Grüße
 
Zuletzt bearbeitet:
danke für eure antworten.
hab nun die ergebnisse aus zeile 25 in die nächstgrößere matrix eingesetzt und kann so alle lösungen berechnen.
 
Zurück
Oben