2009-06-02 14 views
3

Dies ist ein triviales Problem, aber ich fange gerade mit Matlab an und habe mich noch nicht an ihre Denkweise (und Syntax) gewöhnt.Zusammensetzen einer großen Steifigkeitsmatrix aus mehreren kleinen

Was ich frage, wird für jeden offensichtlich sein, der jemals etwas mit FEM oder dergleichen gemacht hat.

Wie stellen Sie eine große Steifigkeitsmatrix aus mehreren kleinen zusammen. Sagen wir, Sie haben für (Element 1) eine lokale Steifigkeitsmatrix 4x4, das Gleiche für (Element 2) - natürlich nur eine andere Matrix, aber immer noch 4x4.

Was ist der einfachste Weg, dies zu tun:

[|--------| 0 0 ] 
[|  | 0 0 ] 
[|  |--|-----|] 
[|-----|--|  |] 
[0 0 |  |] 
[0 0 |--------|] 

(a33+b11, a34+b12, 
(a43+b12, a44+b22, ...) 

das heißt macht einen ‚großen‘?

Antwort

5

Ich glaube, Ihre Frage ist:

A = 4x4 B = 4x4

C = letzte Matrix, wobei A und B überlappen und sollte in Überlappung summiert werden.

tun:

C = zeros(6); 
C(1:4,1:4) = A; 
C(3:6,3:6) = C(3:6,3:6) + B; 
6

Steifigkeitsmatrizen spärlich sein wollen. Verzweifelt so. Der Punkt ist, dass diese großen Steifigkeitsmatrizen mit einer großen Anzahl von Nullelementen enden werden. Also müssen Sie die Matrix mit diesem Gedanken aufbauen. Das Schöne ist, dass spärliche Matrizen in Matlab sehr gut unterstützt werden. Aber Sie müssen richtig mit ihnen arbeiten.

Die Idee besteht darin, Ihre Matrix als eine Liste von Zeilen- und Spaltenindizes aufzubauen, plus den Wert, der in die Matrix eingefügt werden soll. Erstellen Sie diese Liste im Voraus. Nur am Ende nennen Sie spärlich, um die Matrix selbst zu bauen. Sparse wird Elemente, bei denen es Überlappungen gibt, automatisch zusammenfassen.

Sobald diese Sparse-Matrix erstellt wurde, werden alle Operationen wie Matrix-Multiplikationen und Backslash vollständig unterstützt und können im Vergleich zu den gleichen Operationen auf einer vollständigen Matrix sehr schnell ausgeführt werden. Dies ist besonders wichtig, wenn Ihre globale Steifigkeitsmatrix 1e5x1e5 oder größer sein könnte.

In einigen Fällen für große Matrizen müssen Sie möglicherweise zu einem iterativen Solver migrieren, wenn Faktorisierungen Ihrer Matrix unmöglich werden.

+0

mit [ 'sparse'] (http://mathworks.com/help/matlab/ref/sparse.html) ist auf jeden Fall Der Weg, um FEM zu machen! Ich wünschte, ich könnte mehr als eine Aufzählung geben. – knedlsepp

5

Just for fun, hier ist eine einzeilige Lösung BLKDIAG mit:

C = blkdiag(A,zeros(2)) + blkdiag(zeros(2),B); 
+0

Sehr elegant, in der Tat! – Rook

Verwandte Themen