Собираем большую матрицу жесткости из нескольких маленьких - PullRequest
3 голосов
/ 03 июня 2009

Это тривиальная проблема, но я только начинаю с matlab и еще не привык к их мышлению (и синтаксису).

То, что я спрашиваю, будет очевидно для любого, кто когда-либо делал что-то с FEM или чем-то подобным.

Как собрать большую матрицу жесткости из нескольких маленьких? Скажем, вы получили (элемент 1) матрицу локальной жесткости 4x4, то же самое для (элемент 2) - конечно, только другая матрица, но все же 4x4.

Какой самый простой способ сделать это:

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

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

т.е. сделать "большой"?

Ответы [ 3 ]

6 голосов
/ 03 июня 2009

Матрицы жесткости ХОТЯТ быть разреженными. Отчаянно так. Дело в том, что в этих матрицах с большой жесткостью будет огромное количество нулевых элементов. Таким образом, вы должны построить матрицу с учетом этого. Приятно то, что разреженные матрицы очень хорошо поддерживаются в Matlab. Но вам нужно правильно с ними работать.

Идея состоит в том, чтобы построить вашу матрицу в виде списка индексов строк и столбцов плюс значение, которое будет вставлено в матрицу. Составьте этот список заранее. Только в самом конце вы вызываете sparse для фактического построения самой матрицы. Разреженный будет автоматически суммировать элементы, где есть перекрытие.

Как только эта разреженная матрица построена, все операции, такие как умножение матрицы и обратная косая черта, полностью поддерживаются и могут быть очень быстрыми по сравнению с теми же операциями на полной матрице. Это особенно важно, когда ваша общая матрица жесткости может быть 1e5x1e5 или больше.

В некоторых случаях для больших матриц вам может понадобиться перейти к итерационному решателю, когда факторизации вашей матрицы станут невозможными.

5 голосов
/ 03 июня 2009

Просто для удовольствия, вот решение в одну строку, использующее BLKDIAG :

C = blkdiag(A,zeros(2)) + blkdiag(zeros(2),B);
5 голосов
/ 03 июня 2009

Я думаю, что ваш вопрос таков:

A = 4x4 B = 4x4

C = конечная матрица, где A и B перекрываются и должны суммироваться в перекрытии.

Сделайте это:

C = zeros(6);
C(1:4,1:4) = A;
C(3:6,3:6) = C(3:6,3:6) + B;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...