北太天元科普: 有限元方法的刚度矩阵
北太天元科普: 有限元方法的刚度矩阵
在科学与工程领域中,有限元方法(FEM)已成为解决复杂物理问题的重要工具。通过离散化连续体,FEM 允许我们在计算机上模拟并分析各种物理现象,如结构力学、热传导和流体动力学等。在这篇文章中,我们将通过一个简单的例子,探讨如何使用线性三角形元素(线性三角形元)来解决变分问题,并解释刚度矩阵和载荷矩阵的装配过程。
线性三角形元素
线性三角形元素是有限元方法中最简单的元素类型之一。它由三个节点和三条直线边组成,通常用于二维空间中的离散化。在结构分析中,线性三角形元素可用于近似模拟结构的位移场。
变分问题与有限元离散化
在许多工程问题中,我们需要解决的是变分问题,比如寻找某个函数u(x, y),使得某个能量泛函取得极值。在有限元方法中,我们将连续的问题离散化,通过求解离散方程来近似原问题的解。
设u(x, y)是我们想要找到的位移场,在有限元方法中,我们用有限个基函数的线性组合来近似它:
其中,
是基函数,通常与有限元网格的每个节点相关联,
是待求的系数,N是节点的总数。
刚度矩阵和载荷矩阵
在有限元分析中,我们经常需要计算形如
或
的积分。这些积分与结构的能量和刚度有关。通过最小化结构的总势能,我们可以得到一组线性方程,用于求解未知的系数 ( c_k )。
这组线性方程可以表示为:
[ Kc = F ]
其中,K是刚度矩阵,c是包含所有 ( c_k ) 的向量,F是载荷矩阵。刚度矩阵K的元素通常与材料的物理属性和有限元网格的几何形状有关。载荷矩阵F则与外部施加的力或边界条件有关。
在有限元分析中,当我们使用Galerkin变分方法或其他变分原理对二次泛函问题进行离散化时,我们确实会得到一个线性方程组。这个方程组可以表示为 Kc = F 的形式,其中K是系数矩阵,c是未知数的向量,而F是与外部载荷或边界条件相关的向量。
在这个线性方程组中,系数矩阵K通常被称为“刚度矩阵”。这个名称来源于弹性力学中的刚度概念,但实际上,在更广泛的有限元分析应用中,这个矩阵并不总是直接对应于物理上的“刚度”。不过,由于历史和习惯的原因,这个名称被保留了下来。
刚度矩阵之所以这么称呼,是因为在弹性力学问题中,它确实代表了系统的刚度特性。但在其他类型的问题中,比如热传导或流体动力学问题,这个矩阵更多地表示了系统各部分之间的相互作用和关联,而不一定是物理上的“刚度”。
因此,当我们在有限元分析的上下文中提到“刚度矩阵”时,我们可以理解为它是描述系统各部分之间相互作用和关联的数学工具,而不一定局限于物理上的刚度概念。
另外,载荷矩阵(或载荷向量)F代表了外部作用对系统的影响,比如外部力、温度场等。这个向量与刚度矩阵一起,构成了我们需要求解的线性方程组。
总的来说,虽然“刚度矩阵”这个名称可能源于弹性力学中的刚度概念,但在更广泛的有限元分析应用中,我们应该将其理解为描述系统各部分之间相互作用和关联的数学工具。
下面我们再举泊松方程例子逐步介绍有限元方法中的变分问题、刚度矩阵和载荷向量。
变分问题
给定方程 −Δu=f 在区域 Ω 内,且 u 在边界 ∂Ω 上为 0,我们可以将其转化为变分问题。变分问题是在某个函数空间中寻找一个函数 u 来最小化能量泛函:
这里,第一项代表系统的势能,而第二项代表外力做的功。
变分问题的最小值
变分问题的解 u 是使得能量泛函 E(u) 最小的函数。这通常通过求解相应的欧拉-拉格朗日方程来实现,该方程即为原偏微分方程 −Δu=f。
变分导数
为了找到最小化能量泛函的函数,我们需要计算变分导数(即能量泛函关于 u 的导数)。令 v 为任意测试函数,则变分导数
定义为:
为了计算变分导数
,我们首先需要展开
,然后对其进行微分。
给定能量泛函:
将 u 替换为
,我们得到:
展开
,我们得到:
将这个表达式代入 $E(u + \epsilon v)$,我们得到:
现在,我们对 $\epsilon$ 进行微分,并令 $\epsilon = 0$ 来找到变分导数:
所以,变分导数 $\delta E(u; v)$ 就是上面的表达式。这个表达式描述了能量泛函 $E(u)$ 在 $u$ 处沿方向 $v$ 的变化率。在有限元方法中,这个变分导数被用来构建线性方程组,进而求解近似的解 $u_h$。
在有限元方法中,我们将解空间和试验函数空间限制在由基函数
张成的子空间中。这样,我们可以将 u 近似为
。
刚度矩阵和载荷向量
将
代入变分问题
中,把试验函数 v 分别取成
, 我们得到
这样,
会导出一个线性方程组 Kc=F,其中 K 是刚度矩阵,其元素由基函数的积分给出:
这个矩阵描述了系统各部分之间的相互作用,即“刚度”。
载荷向量 F 的元素由外部力 f 和基函数的积分给出:
这个向量代表了外部载荷对系统的影响。
总结来说,通过有限元方法,我们将原始的偏微分方程转化为一个线性方程组,其中刚度矩阵和载荷向量分别描述了系统的内部相互作用和外部载荷的影响。
单元刚度矩阵
在有限元方法中,全局基函数
通常是由局部单元上的形函数(或称为单元基函数)
组合而成。这些形函数在各自所属的单元
上有定义,并且通常被延拓到整个求解域
,在单元外部其值为零。
首先,我们定义全局基函数
为所有包含节点 j 的单元上的形函数的总和:
其中
是包含节点 j 的所有单元的集合。形函数
在单元
内部有定义,并且满足以下条件:
,即在节点 k 上,只有当
时取 1,否则取 0。
- 在单元
外部,
。
现在,我们考虑全局刚度矩阵 K 中的元素
,它定义为:
将全局基函数展开为形函数的和,我们得到:
由于形函数在它们各自单元外部为零,因此上述积分可以分解为各个单元上的积分的和:
这里的求和是对所有同时包含节点 i 和 j 的单元进行的。
现在,我们可以定义单元刚度矩阵$K_e$的元素为:
于是,全局刚度矩阵的元素 K_{ij} 就是所有共享节点 i 和 j 的单元的单元刚度矩阵元素
的和。
在有限元分析中,我们通常会处理两种节点编号:局部节点编号和全局节点编号。
- 局部节点编号:这是针对每个单元内部的节点进行的编号。例如,在一个三角形单元中,我们可能有三个节点,分别用1, 2, 3这样的局部编号来标识。这些编号只在当前单元内有意义。
- 全局节点编号:这是在整个求解域中唯一标识每个节点的编号。全局编号是在网格生成时确定的,并且对于整个模型中的每个节点都是唯一的。
现在,我们来看如何将局部刚度矩阵
中的元素映射到全局刚度矩阵K中。
局部刚度矩阵
对于一个三角形单元,局部刚度矩阵 是一个3x3的矩阵,表示该单元内节点之间的相互作用。这个矩阵的元素是通过在单元上进行积分计算得到的,如前面所述。
全局刚度矩阵
全局刚度矩阵K是一个更大的矩阵,其大小取决于整个模型中节点的数量。这个矩阵表示整个模型中所有节点之间的相互作用。
映射过程
- 确定对应关系:首先,我们需要知道每个局部节点编号对应的全局节点编号。这个信息是从网格剖分中得到的,通常存储在一个映射表中。
- 累加元素:然后,我们遍历局部刚度矩阵 中的每个元素。对于每个元素,我们找到局部节点编号i和j对应的全局节点编号I和J。
- 更新全局刚度矩阵:最后,我们将局部刚度矩阵中的元素值累加到全局刚度矩阵的相应位置上。即,我们将的值加到全局刚度矩阵的 位置上。
示例
假设我们有一个三角形单元,其局部节点编号为1, 2, 3,对应的全局节点编号为10, 20, 30。现在,我们要将局部刚度矩阵 中的元素映射到全局刚度矩阵中。
如果 =k,那么我们需要在全局刚度矩阵中找到位置(10,20)(对应于全局节点编号10和20),并将该位置的值增加k。
这个过程会对所有单元和所有局部刚度矩阵的元素重复进行,直到全局刚度矩阵被完全填充。
通过这种方式,我们可以看到全局刚度矩阵K是如何由各个单元的单元刚度矩阵K_e组装而成的。这也解释了为什么在计算全局刚度矩阵时,我们需要在每个单元上进行积分,并将结果累加到全局矩阵中相应的位置上。
装配的总体思路是:
- 对于每个元素,根据其材料属性和几何形状计算单元刚度矩阵。
- 遍历所有元素,将单元刚度矩阵的元素按照节点编号累加到总体刚度矩阵的相应位置。
- 应用边界条件,例如固定支撑或外力作用点,这可能会修改刚度矩阵的某些元素。
- 求解线性方程组 ( Kc = F ) 以获得结构的位移场。
北太天元代码示例
首先,我们明确问题的设定。考虑二维泊松方程:
在区域 (\Omega = (0,1) \times (0,1)) 上,其中精确解为
。因此,右端项 f 可以通过对精确解应用拉普拉斯算子得到,即
。
接下来,我们将区域 (\Omega) 用北太天元的mesh插件的mesh2d剖分为三角形网格。
现在,我们将通过以下步骤演示如何从单元刚度矩阵装配成全局刚度矩阵:
- 计算单元刚度矩阵:对于每个三角形单元,我们可以根据形函数和单元上的积分计算出一个 3x3 的单元刚度矩阵。
- 装配全局刚度矩阵:遍历所有单元,将每个单元刚度矩阵的元素根据节点编号累加到全局刚度矩阵的相应位置上。
下面是一个简化的 北太天元 代码示例,用于计算和装配全局刚度矩阵:
注意:上述代码中的 函数是一个占位符,它应该根据实际的形函数和积分公式来计算单元刚度矩阵。在实际应用中,你需要根据所使用的有限元方法和形函数来具体实现这个函数( 下面我们也许再写一个帖子里讨论一下如何计算单元刚度矩阵)。
此外,上述代码没有考虑边界条件。在实际问题中,你还需要根据边界条件对全局刚度矩阵和载荷向量进行相应的调整。在这个特定的例子中,由于我们使用了零边值条件,因此需要将全局刚度矩阵中对应边界节点的行和列设置为零,并将载荷向量中对应边界节点的元素设置为零。
用spy函数显示刚度矩阵的非零元的位置