Implementierung des Eliminationsverfahrens
Aus EINI
Version vom 9. März 2020, 22: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…“)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | 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]; } } |