Hallo,
ich versuche mich derzeit an einer eigenen Klasse zum lösen von linearen Gleichungssystemen der Form Ax=y, wobei A eine quadratische Matrix mit einer beliebigen Zeilen-/Spaltenanzahl n ist.
Mein Code führt auch zu den richtigen Ergebnissen, solange an den entscheidenden Stellen keine Nullen im Spiel sind.
(Anmerkung: Die Spalte ganz rechts repräsentiert den y Vektor)
(Konsolenausgabe) Matrix, die korrekt gelöst wird:
( 2.0 | 3.0 | 0.0 )
( 4.0 | 7.0 | 1.0 )
Ergebnis: [-1.5, 1.0]
(Konsolenausgabe) Matrix, bei der Probleme auftauchen:
( 0.0 | 2.0 | 1.0 )
( 2.0 | 1.0 | 1.0 )
Ergebnis: [NaN, 0.5]
Wie dieser Fehler zustande kommt ist mir klar: Es kommt zu einer Division von 0 / R (R: eine Reele Zahl), die bei einer "von Hand" ausgeführten Rechnung durch die richtige Sortierung der Zeilen verhindert würde.
Nur wie bringt man dem Computer bei, die Zeilen vorher korrekt zu sortieren?
Ich habe mich in dem Zusammenhang ein wenig durch das Web gegooglet und oft etwas von Pivotisierung und LR-Zerlegung gelesen, aber leider nicht wirklich verstanden, worum es dabei geht, bzw. wie es funktioniert. ???:L
Kennt jemmand vieleicht einen guten Link oder eine gute Erklärung?
Hoffe Ihr könnt mir weiterhelfen
Mein Code:
ich versuche mich derzeit an einer eigenen Klasse zum lösen von linearen Gleichungssystemen der Form Ax=y, wobei A eine quadratische Matrix mit einer beliebigen Zeilen-/Spaltenanzahl n ist.
Mein Code führt auch zu den richtigen Ergebnissen, solange an den entscheidenden Stellen keine Nullen im Spiel sind.
(Anmerkung: Die Spalte ganz rechts repräsentiert den y Vektor)
(Konsolenausgabe) Matrix, die korrekt gelöst wird:
( 2.0 | 3.0 | 0.0 )
( 4.0 | 7.0 | 1.0 )
Ergebnis: [-1.5, 1.0]
(Konsolenausgabe) Matrix, bei der Probleme auftauchen:
( 0.0 | 2.0 | 1.0 )
( 2.0 | 1.0 | 1.0 )
Ergebnis: [NaN, 0.5]
Wie dieser Fehler zustande kommt ist mir klar: Es kommt zu einer Division von 0 / R (R: eine Reele Zahl), die bei einer "von Hand" ausgeführten Rechnung durch die richtige Sortierung der Zeilen verhindert würde.
Nur wie bringt man dem Computer bei, die Zeilen vorher korrekt zu sortieren?
Ich habe mich in dem Zusammenhang ein wenig durch das Web gegooglet und oft etwas von Pivotisierung und LR-Zerlegung gelesen, aber leider nicht wirklich verstanden, worum es dabei geht, bzw. wie es funktioniert. ???:L
Kennt jemmand vieleicht einen guten Link oder eine gute Erklärung?
Hoffe Ihr könnt mir weiterhelfen
Mein Code:
Code:
import java.util.*;
public class LGS
{
public static void main(String[] args)
{
// LGS lTestLGS = new LGS( new double[][]{{2,3,0},{4,7,1}});
// LGS lTestLGS = new LGS( new double[][]{{3,6,-2,-4},{3,2,1,0},{(double)3/2,5,-5,-9}});
LGS lTestLGS = new LGS( new double[][]{{0,2,1},{2,1,1}});
lTestLGS.printToConsole();
System.out.print( Arrays.toString( lTestLGS.solve() ) );
}
private double lLGS[][];
public LGS ( double pLGS[][] )
{
lLGS = pLGS;
}
public double[] solve( )
{
for( int i=0; i<lLGS.length-1; i++ )
{
// System.out.println("LGS Primary cursor is now in line " + i);
for( int j=i+1; j<lLGS.length; j++ )
{
// System.out.println("LGS Secondary cursor is now in line " + j);
double lFactor = lLGS[i][i] / lLGS[j][i];
System.out.println("LGS Factor: " + lLGS[i][i] + " / " + lLGS[j][i] + " = " + lFactor);
for( int k=i; k<lLGS[0].length; k++ )
{
System.out.print("LGS Calc: " + lLGS[j][k] + " * " + lFactor + " - " + lLGS[i][k] + " = " );
lLGS[j][k] = lLGS[j][k] * lFactor - lLGS[i][k];
System.out.print(lLGS[j][k] + "\r\n");
}
// this.printToConsole();
}
}
double lSolutions[] = new double[lLGS.length];
for( int i=lLGS[0].length-2; i>=0; i-- )
{
double lTemp = lLGS[i][lLGS[0].length-1];
for( int j=lLGS[0].length-2; j>i; j--)
{
// System.out.print( lTemp );
lTemp = lTemp - lLGS[i][j] * lSolutions[j];
// System.out.print( " - " + lLGS[i][j] + " * " + lSolutions[j] + " = " + lTemp + "\r\n");
// System.out.println("j " + j );
}
// System.out.println("i " + i );
lSolutions[i] = lTemp / lLGS[i][i];
// System.out.println( "LSG: " + lTemp + " / " + lLGS[i][i] + " = " + lSolutions[i] );
}
return lSolutions;
}
public void printToConsole()
{
String lOutput = new String();
for( int i=0; i<lLGS.length; i++ )
{
lOutput = lOutput + "( ";
for( int j=0; j<lLGS[i].length; j++ )
{
lOutput = lOutput + lLGS[i][j];
if( j+1 <lLGS[i].length ) lOutput = lOutput + " | ";
}
lOutput = lOutput + " )\r\n";
}
System.out.println(lOutput);
}
}