Implementierung des Eliminationsverfahrens
Aus EINI
Version vom 9. März 2020, 21:32 Uhr von Elias (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „<source lang="java"> package Gauß; public class LGS { public static void main (String[] args) { double[][] A= {{3,1,6},{2,1,3},{1,1,1}}; double[] b= {2…“)
package Gauß; public class LGS { public static void main (String[] args) { double[][] A= {{3,1,6},{2,1,3},{1,1,1}}; double[] b= {2,7,4}; print2D(A); System.out.println(); printVektor(b); System.out.println(); printVektor(LGSloesen (A ,b)); } public static void printVektor(double[] array) { // gibt Array in Vektorschreibweise aus System.out.print("("); for(int i=0; i<array.length-1; i++) { System.out.print(array[i] + ","); } System.out.print(array[array.length-1]); System.out.println(")^T"); } public static void print2D(double[][] A) { // gibt quadr. 2D Array aus int n=A.length; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { System.out.print(A[i][j] + " "); } System.out.println(); } } public static double[] LGSloesen (double[][] A ,double[] b) { //loest regulaeres LGS Ax=b //umformen, sodass eine obere Dreiecksmatrix die Koeffizientenmatrix ist. for(int j=0;j<b.length-1;j++) { PivotierungElimination (A,b,j); } //nutze Algorithmus für LGS mit oberer Dreiecksmatrix als Koeffizientenmatrix double[] x=LGSobereDreiecksmatrix(A,b); return x; } public static double[] LGSobereDreiecksmatrix(double[][] A, double[] b) { //setze Werte rueckwaerts ein int n=b.length; double[] x=new double[n]; x[n-1]=b[n-1]/A[n-1][n-1]; for(int j= n-2;j>=0;j--) { double sum=0; for(int k=j+1;k<n;k++) { sum=sum+A[j][k]*x[k]; } x[j]=(b[j]-sum)/A[j][j]; } return x; } public static int Pivotindize (double[][] A, int Spalte) { //findet Indize, der >= Spaltenindizee ist, mit groesstem Eintrag in gegebener Spalte int n =A.length; int argmax=Spalte; double max=A[Spalte][Spalte]; for(int i=Spalte+1;i<n;i++) { if(A[i][Spalte]>max) { max=A[i][Spalte]; argmax=i; } } return argmax; } public static void ZeilenTauschen (double[][] A, double[] b, int zeile1, int zeile2){ int n=b.length; //temporäre Hilfsvariablen double [] Azeile1vorher =new double[n]; for(int j=0;j<n;j++) { Azeile1vorher[j]=A[zeile1][j]; } double bzeile1vorher = b[zeile1]; //tauschen for(int j=0;j<n;j++) { A[zeile1][j]=A[zeile2][j]; A[zeile2][j]=Azeile1vorher[j]; } b[zeile1]=b[zeile2]; b[zeile2]=bzeile1vorher; //keine Rückgabe, da Arrays nicht primitiv } public static void PivotierungElimination (double[][] A, double[] b, int Spalte) { //Pivotelement soll vor Elimination auf der Diagonalen liegen int pivot=Pivotindize (A, Spalte); if(pivot>Spalte) { ZeilenTauschen (A, b, Spalte, pivot); } //Elimination: zu jeder Zeile mit Zeilenindize>Spaltenidize wird das c-fache der durch "Spalte" vorgegebenen Zeile addiert //c wird hierbei stets so gewaehlt, dass unter dem Pivotelement nur Nullen sind for(int i=Spalte+1;i<b.length;i++) { ZeileAddieren(A,b, -A[i][Spalte]/A[Spalte][Spalte] ,Spalte,i); } } public static void ZeileAddieren(double[][] A, double[] b, double c, int Pivotindize, int a) { // addiert das c-fache der Zeile mit Pivotelement zu Zeile a //(beachte, dass bei der Elimination das Pivotelement auf der Diagonalen liegt) for(int j=0;j<b.length;j++) { A[a][j]=A[a][j]+c*A[Pivotindize][j]; } b[a]=b[a]+c*b[Pivotindize]; } }