Das Matlab-Script und die Testrechnungen
Im nachfolgend zu sehenden Script wird das Gleichungssystem in den Zeilen 3 bis 20 erzeugt. Dies ist für die hier anzustellenden Betrachtungen nicht interessant (für Interessenten: Matlab-Femset). In Zeile 3 wird allerdings mit den beiden Paramtern nr und ny die Feinheit des FEM-Netzes und damit die Anzahl der Unbekannten für das lineare Gleichungssystem festgelegt.
In Zeile 23 wird das Gleichungssystem mit dem Matlab-Standard-Solver (direktes Verfahren), in Zeile 30 mit dem Konjugierte-Gradienten-Verfahren gelöst. Als Referenzwert (für die Kontrolle der Genauigkeit der Rechnung) wird die vertikale Aufweitung des Kreisausschnitts infolge der Belastung gewählt (Ausgabe in den Zeilen 25 bzw. 32).
- Die Lösungen mit dem Matlab-Standard-Solver (direktes Verfahren) waren sämtlich problemlos, die erforderlichen Rechenzeiten bemerkenswert gering..
- Die Lösungen mit dem Konjugierte-Gradienten-Verfahren verlangen einige Versuche, bis die richtige Einstellung für den Präkonditionierer gefunden ist:
- Die Standardvariante für das "Incomplete Cholesky"-Verfahren ist (wie oben in Zeile 28 zu sehen) der Aufruf mit dem String '0' als zweitem Parameter. In diesem Fall werden nur genau die Elemente der Dreicksmatrix erzeugt, deren Positionen auch in der Matrix Ks Nicht-Null-Elemente erhalten. Diese "klassische" Variante war nur für kleine Gleichungssysteme (mit weniger als 1000 Gleichungen) möglich, bei größeren Systemen kam die folgende Fehlermeldung:
- Matlab bietet noch eine andere Aufrufvariante für cholinc an: Als zweiter Parameter kann eine so genannte "Drop tolerance" angegeben werden, mit der der Füllungsgrad der erzeugten Dreiecksmatrix beliebig gesteuert werden kann (es können deutlich weniger Elemente als bei der klassischen Variante sein, andererseits auch deutlich mehr). In den beiden Extremfällen erhält man eine reine Diagonalmatrix (Drop tolerance 1) bzw. das Ergebnis der kompletten Cholesky-Zerlegung (Drop tolerance 0). Die folgende Tabelle zeigt das Ergebnis einer Testserie mit unterschiedlichen Werten für die Drop tolerance (durchgeführt mit einem Gleichungssystem mit 19682 Gleichungen):
Drop tolerance
|
Elementanzahl in Dreiecksmatrix
|
Anzahl erforderlicher pcg-Iterationen
|
Gesamt- rechenzeit [s] (cholinc + pcg)
|
|
1
|
19 682
|
1124
|
87,7
|
Diagonalmatrix
|
0,1
|
84 987
|
455
|
50,9
|
|
0,01
|
297 111
|
85
|
12,2
|
|
0,001
|
574 918
|
26
|
6,9
|
|
0,0001
|
1 248 443
|
11
|
9,0
|
|
0,00001
|
2 906 467
|
4
|
16,9
|
|
|
Rechts sieht man im Command Window die Ergebnisse der Berechnung mit der Drop tolerance 0,001, für die sich eine Rechtsdreiecksmatrix mit 574 918 Elementen ergibt. Zum Vergleich: Die komplette Cholesky-Zerlegung ergibt eine Dreiecksmatrix mit 4 022 393 Elementen, die "klassische Variante" des "Incomplete Cholesky" führt auf eine Dreiecksmatrix mit 309 733 Elementen.
Man erkennt in der Tabelle, dass mit einem höheren Füllungsgrad der Dreiecksmatrix, die als Präkonditionierer verwendet wird, das anschließende Iterationsverfahren immer schneller konvergiert. Allerdings erfordert die Herstellung besserer Präkonditionierer auch einen höheren Aufwand. Ein gewisses Optimum ergibt sich bei einer Drop tolerance von 0,001, deshalb werden die folgenden Berechnungen mit unterschiedlich großen Gleichungssystemen mit Präkonditionierern durchgeführt, die mit dieser Drop tolerance erzeugt werden.
Vergleich der Rechenzeiten für Gleichungssysteme unterschiedlicher Größe:
Anzahl der finiten Elemente
|
Anzahl der Gleichungen
|
Rechenzeit [s] für Standard-Solver (direktes Verfahren)
|
Anzahl erforderlicher pcg-Iterationen
|
Gesamt- rechenzeit [s] (cholinc + pcg)
|
800
|
5 043
|
0,61
|
13
|
1,05
|
3 200
|
19 682
|
4,44
|
26
|
6,88
|
7 200
|
43 922
|
13,8
|
38
|
21,1
|
12 800
|
77 762
|
37,6
|
51
|
49,2
|
20 000
|
121 202
|
70,7
|
63
|
93,2
|
|
|