将几个小刚度矩阵组合成一个大刚度矩阵

3

这是一个微不足道的问题,但我刚开始接触matlab,并且还没有习惯他们的思维方式(和语法)。

对于任何已经使用过有限元或类似技术的人来说,我的问题将是显而易见的。

如何从几个小矩阵组合成一个大刚度矩阵。例如,对于(元素1),您得到一个本地的4x4刚度矩阵,(元素2)同样也是4x4,只是矩阵不同。

最简单的方法是什么:

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

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

即制作一个“大的”?
3个回答

6

刚性矩阵非常希望变得稀疏。这是非常迫切的。关键在于,这些大型刚度矩阵最终会有大量零元素。因此,你需要在构建矩阵时考虑到这一点。好处在于 matlab 非常好地支持稀疏矩阵。但是,你需要正确使用它们。

思路是将矩阵构建为行和列索引的列表,以及要插入矩阵中的值。提前建立这个列表。只有在最后才调用 sparse 来实际构建矩阵本身。Sparse 将自动对重叠部分进行求和。

一旦构建了这个稀疏矩阵,所有操作(如矩阵乘法和反斜杠)都得到完全支持,并且与在完整矩阵上执行相同操作相比,速度可以非常快。当你的全局刚度矩阵可能达到 1e5x1e5 或更大时,这尤其重要。

在某些情况下,针对庞大的矩阵,当无法进行矩阵因式分解时,你可能需要迁移到迭代求解器。


使用sparse绝对是进行有限元分析的最佳选择!我希望我能给出更多的赞。 - knedlsepp

5

我认为你的问题是:

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;

5

仅供娱乐,以下是使用BLKDIAG的一行解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接