220 likes | 466 Views
Gaußscher Algorithmus. Aufgabenstellung. Lösen Sie das lineare Gleichungssystem AX=B !. Gegeben: Dimension N ( int N; ) Koeffizienten A ij für i=0,...,N-1 und j=0,...,N-1 ( double [][] A = new double [N][N]; ) rechte Seite B i für i=0,...,N-1
E N D
Aufgabenstellung • Lösen Sie das lineare Gleichungssystem AX=B ! • Gegeben: • Dimension N • ( int N; ) • Koeffizienten Aijfür i=0,...,N-1 und j=0,...,N-1 • ( double [][] A = new double [N][N]; ) • rechte Seite Bi für i=0,...,N-1 • ( double [] B = new double [N]; )
Gesucht: • Existenz : Gibt es eine Lösung? • Einzigkeit : Wenn es eine Lösung gibt, ist es die einzige Lösung? • Lösung bzw. Lösungsmenge
Gaußscher Algorithmus • Für die erste Gleichung gilt:
X[0]=B[0]; for (int j=1; j<N; j++) { X[0] -= A[0][j]*X[j]; } X[0] /= A[0][0];
X0 in den anderen (k=1,2,...,N-1) Gleichungen ersetzen: Die Gleichungen hängen nur noch von X1, X2, ... , XN-1ab. Die Dimension des Gleichungssystems ist also um 1 erniedrigt. Algorithmus kann „in place“ durchgeführt werden, d.h. die Felder A und B können wiederverwendet werden.
für k=1,...,N-1 und j=1,...,N-1 für k=1,...,N-1 Koeffizienten und rechte Seiten des reduzierten Gleichungssystems for (int k=1; k<N; k++) { for (int j=1; j<N; j++) { A[k][j] -= A[k][0]*A[0][j]/A[0][0]; } } for (int k=1; k<N; k++) { B[k] -= A[k][0]*B[0]/A[0][0]; }
Dieses Gleichungssystem und das ursprüngliche sind lösungsäquivalent. Voraussetzung : Nach der Anwendung eines Schrittes des Gaußschen Verfahrens entsteht folgendes Gleichungssystem (mit modifizierten Koeffizienten und rechten Seiten):
Dieses Gleichungssystem und das ursprüngliche sind lösungsäquivalent. Voraussetzung : Nach der Anwendung von i Schritten des Gauß-Jordan Verfahrens entsteht folgendes Gleichungssystem:
X[i]=B[i]; for (int j=i+1; j<N; j++) { X[i] -= A[i][j]*X[j]; } X[i] /= A[i][i];
Xi in den anderen (k=i+1,2,...,N-1) Gleichungen ersetzen: Die Gleichungen hängen nur noch von Xi+1, Xi+2, ... , XN-1ab.
für k=i+1,...,N-1 und j=i+1,...,N-1 für k=i+1,...,N-1 Koeffizienten und rechte Seiten des reduzierten Gleichungssystems for (int k=i+1; k<N; k++) { for (int j=i+1; j<N; j++) { A[k][j] -= A[k][i]*A[i][j]/A[i][i]; } } for (int k=i+1; k<N; k++) { B[k] -= A[k][i]*B[i]/A[i][i]; }
Dieses Gleichungssystem und das ursprüngliche sind lösungsäquivalent. Voraussetzung : Nach der Anwendung von N-1 Schritten des Gaußschen Verfahrens entsteht folgendes Gleichungssystem:
Es bleibt die Gleichung : X[N-1]=B[N-1]/A[N-1][N-1];
for (int i=0; i<N-1; i++) { for (int k=i+1; k<N; k++) { for (int j=i+1; j<N; j++) { A[k][j] -= A[k][i]*A[i][j]/A[i][i]; } B[k] -= A[k][i]*B[i]/A[i][i]; } } X[N-1]=B[N-1]/A[N-1][N-1]; for (int i=N-2; i>=0; i--) { X[i]=B[i]; for (int j=i+1; j<N; j++) { X[i] -= A[i][j]*X[j]; } X[i] /= A[i][i]; }
for (int i=0; i<N-1; i++) { for (int k=i+1; k<N; k++) { for (int j=i+1; j<N; j++) { A[k][j] -= A[k][i]*A[i][j]/A[i][i]; } B[k] -= A[k][i]*B[i]/A[i][i]; } } for (int i=N-1; i>=0; i--) { X[i]=B[i]; for (int j=i+1; j<N; j++) { X[i] -= A[i][j]*X[j]; } X[i] /= A[i][i]; }
Problem: Ai,i muss immer verschieden von Null sein! Z.B.: Das System ist eindeutig lösbar X1 = X2 = X3 = 1. Der Algorithmus funktioniert aber nicht, da A0,0 = 0. Man braucht nur die Gleichungen umzusortieren und der Algorithmus funktioniert.
double maxa = Math.abs(A[i][i]); int imaxa = i; for (int k=i+1; k<N; k++) { if ( Math.abs(A[k][i])>maxa ) { maxa = Math.abs(A[k][i]); imaxa = k; } } if (i != imaxa) { double [] Ah = A[i]; A[i]=A[imaxa]; A[imaxa]=Ah; double h = B[i]; B[i]=B[imaxa]; B[imaxa]=h; }