KragtraegerMitLinienlastAuf der Seite "Beispiel: System mit schlecht konditionierter Matrix" wird für ein Gleichungssystem, das für ein einfaches Problem (Skizze rechts) mit dem Finite-Elemente-Algorithmus erzeugt wird, gezeigt, dass die Kondition der Koeffizientenmatrix mit feinerer Diskretisierung (und damit größeren Gleichungssystemen) sehr stark nachlassen kann, bis schließlich die Lösungen unbrauchbar werden. Hier soll an diesem Beispiel gezeigt werden, dass mit Skalierung des Gleichungssystems die Kondition der Koeffizientenmatrix (und damit die Lösung) verbessert werden kann, dass dies aber durchaus nicht immer gilt. Die Entstehung des im Folgenden verwendeten Gleichungssystems ist für die Betrachtungen hier unbedeutend (Interessenten finden Hinweise auf dieser Seite). Als Kennzeichen für die Qualität der Lösung soll die Vertikalverschiebung des rechten Randpunkts dienen. Die exakte Lösung ist mit den für das Gleichungssystem verwendeten Zahlenwerten: vend = 12,5 mm.

KondtestSkal03Das nebenstehend zu sehende Matlab-Script baut in den Zeilen 1 bis 22 mit dem Matlab-Femset-Algorithmus das lineare Gleichungssystem auf (für Interessenten: Matlab-Femset). Von Interesse ist nur Zeile 5, in der festgelegt wird, in wieviele Elemente n der Träger eingeteilt wird und dass dabei (siehe Zeile 26) 2n+2 Gleichungen entstehen.

In Zeile 24 wird die Koeffizientenmatrix in das von Matlab unterstützte Sparse-Matrix-Format umgewandelt. Nach Berechnung der Konditionszahl (Zeile 27) wird das Gleichungssystem mit dem Matlab-Standard-Solver gelöst (Zeile 28) und die Verschiebung am Trägerende, die als Indikator für die Genauigkeit gelten soll, wird in Zeile 30 ausgegeben.

In Zeile 31 wird dann die Koeffizientenmatrix "zeilenskaliert", und die Rechnung wird mit der skalierten Matrix wiederholt.

 

Die Berechnung der Konditionszahl mit der Matlab-Function condest liefert nur eine Abschätzung. Dies ist kein nennenswerter Nachteil, weil die Rückschlüsse aus der Konditionszahl auf die Qualität der Ergebnisse ohnehin nur grobe Richtwerte liefern kann.

 

Durch Änderung des Wertes n in der Zeile 5 des Matlab-Scripts kann die Anzahl der Gleichungen des linearen Gleichungssystems beliebig verändert werden. Die nachfolgende Tabelle zeigt eine Zusammenstellung der Ergebnisse verschiedener Rechnungen:

n(Anzahl
der
Ele-
mente)

Anzahl
der
Glei-
chungen

Konditions-
zahl
(ohne
Skalierung)

vend (ohne
Skalierung)

Fehler
(in Einheiten
der letzten
mitgeführten
Stelle)

Konditions-
zahl
(mit
Skalierung)

vend (mit
Skalierung)

Fehler
(in Einheiten
der letzten
mitgeführten
Stelle)

1

4

1,3 · 106

12,50000000000000

0

4,0 · 103

12,50000000000000

0

10

22

1,7 · 108

12,49999999997288

2 712

3,2 · 106

12.50000000000245

245

100

202

1,7 · 1010

12,49999996058087

3 941 913

2,9 · 109

12.50000000361842

361 842

1000

2002

7,5 · 1012

12,50008289355718

8 289 355 718

1,3 · 1013

12.50025624778609

25 624 778 609

10000

20002

1,2 · 1017

25,14085137285164

Alle Stellen falsch

1,2 · 1017

11.79192425505589

70 807 574 494 411

20000

40002

1,9 · 1018

-25,0189313590242

Alle Stellen falsch

6,2 · 1017

-4.39290057389789

Alle Stellen
falsch

Man erkennt, dass bei den kleineren Gleichungssystemen die Skalierung eine deutliche Verkleinerung der Konditionszahl und damit eine Verbesserung der Ergebnisse liefert. Bei den größeren Systemen, bei denen eine Verbesserung besonders wünschenswert wäre, bringt die Skalierung nichts.

Fazit: Die schon auf der Seite "Beispiel: System mit schlecht konditionierter Matrix" ausgesprochene Warnung kann auch bei vorheriger Skalierung kaum abgeschwächt werden, denn für die großen Gleichungssysteme werden vom Matlab-Solver die unsinnigen Ergebnisse ohne jeden Hinweis ausgegeben.

Verwandt mit dem Problem der schlecht konditionierten Matrizen sind auch die Probleme mit singulären Matrizen. Man vergleiche hierzu: "Matlab: Probleme mit singulären Matrizen".

Zum Download verfügbar sind das abgebildete Matlab-Script und die daraus aufgerufenen Functions und DLLs:
 
KondTestSkal.m, syswbc_m.dll, SymBand2Sparse.m, SkalGlsSparse.m