2021/11/28 下午4:40 有限元分析(FEA)是个什么东东 - 知乎 首发于 小潘是个工程师 参考文献: [1] Larson, Mats G., and Fredrik Bengzon. "The finite element method: theory, implementation, and practice." 五、如何获得“弱形式”的解 前面我们计算了函数 的,那 的基函数空间的投影情况,我们说有限元是为了解决偏微分方程求解 和偏微分方程又有什么关系呢?这就牵扯到微分方程的“弱形式”了!获得微分方 程的“弱形式”解,可以说是有限元法最重要的概念之一,我们看一下是怎么一回事!假设我们微 分方程具有下列形式: 边界条件为: https://zhuanlan.zhihu.com/p/56326567 15/28 2021/11/28 下午4:40 有限元分析(FEA)是个什么东东 - 知乎 首发于 小潘是个工程师 其中 和 为给定的函数, , , 和 是给定常数。具 有给定热源的一维热传导方程就具备这种形式。微分方程描述的是微观状态,但是我们一般更容易 掌握的是宏观的现象,所以呢,方程我们一般喜欢把微分方程转化成积分方程,比如对上式两边同 时积分: 乍一看,皆大欢喜,实际上有问题,问题在哪呢?——以上方程表示在整个计算域 中, 方程的积分值相等,也就是平均值相等,与原来要求处处相等相比,显得“太弱了”!那怎么办 呢?——我们可以找一个试函数 当然, (任意的),将原方程改写成如下方式: 不能表现太糟糕,至少要保证两边积分都是收敛的。上述方程对于所有满足条件的 都成立,这个要求太强了,显然当 时这个方程是成立的,那是不是只有 这种情况下才成立呢?——实际上就是的,这可以通过变分法证明。 下一个问题就来了,既然 有千千万万,那我们到底选择哪一个?总不能都选择吧!——前 面我们说了,有限元就是为了解决偏微分方程的求解问题,思路就是将复杂的空间切成很多小区 域,每个区域上假设一个试函数test function(或者叫形函数shape function) 通过求取试函数的系数 来获得函数 ,然后 的近似。试函数有一个特点,它只在一个很小的区 间上有数值,其他地方都为零。如果我们在每个点上都用试函数测试一遍,这样至少能保证所单元 上都成立的!——这种将试函数和形函数选择为同一个函数的方法,是一个俄国人最先使用的, 我们称之为伽辽金(Galerkin)法。 这样我们就得到了如下的方程: 这就是所谓的原微分方程的弱形式!之所以“弱”,是因为这个方程的解只能保证在每个单元上方 程左右两边的平均值相等,而不是原微分方程要求的每一点都相等。注意此时的 原微分方程的解 https://zhuanlan.zhihu.com/p/56326567 已经与 有了差异,因为我们现在是用有限维空间去近似了原无限维空间。 16/28 2021/11/28 下午4:40 有限元分析(FEA)是个什么东东 - 知乎 接下来我们要继续变形了,要稍微用点数学知识——不知道大家还记不得分部积分法:假设有函 首发于 数 和 ,则很容易得到 小潘是个工程师 乘积的微分为: 为二阶无穷小,可略去,所以可以得到: 两边积分得到: 现在我们令 , ,则有 所以我们可以得到: 通过这种变化,我们对 的要求由2阶降到了1阶,将形函数 从0阶增加到了1阶,由 于形函数是我们自己设计的,这就降低了对原微分方程解的光滑性要求。将边界条件代入上式,可 得展开的微分方程弱形式: 我们可以假设 代入展开的微分方程弱形式就可以得到: https://zhuanlan.zhihu.com/p/56326567 17/28 2021/11/28 下午4:40 有限元分析(FEA)是个什么东东 - 知乎 首发于 小潘是个工程师 其中 和 为 矩阵, 和 为 向量,具体表达式如下: 矩阵,称之为刚度矩阵, 为负载矩阵,和前面的定义一 这样我们就将微分方程转化成了线性矩阵方程: 其中 为 样。和前面的计算相似,可以获得 的完整矩阵形式如下: 为边界条件带来的等效矩阵,显然只有 很容易求得 https://zhuanlan.zhihu.com/p/56326567 , 或者 时 才有取值, ,即 18/28 2021/11/28 下午4:40 所以可以得到: 有限元分析(FEA)是个什么东东 - 知乎 首发于 小潘是个工程师 MATLAB代码如下: function A = StiffMat1D(x,kappa) n = length(x)-1; A = zeros(n+1,n+1); for i = 1:n h = x(i+1) - x(i); A(i,i) = A(i,i) + 1/h; A(i,i+1) = A(i,i+1) - 1/h; A(i+1,i) = A(i+1,i) - 1/h; A(i+1,i+1) = A(i+1,i+1) + 1/h; end A(1,1) = A(1,1) + kappa(1); A(n+1,n+1) = A(n+1,n+1) + kappa(2); 很容易得到: MATLAB代码如下: function b = LoadVec1D(x,f,kappa,g) n = length(x)-1; https://zhuanlan.zhihu.com/p/56326567 19/28 2021/11/28 下午4:40 有限元分析(FEA)是个什么东东 - 知乎 b = zeros(n+1,1); 首发于 for i = 1:n 小潘是个工程师 h = x(i+1) - x(i); b(i) = b(i) + f(x(i))*h/2; b(i+1) = b(i+1) + f(x(i+1))*h/2; end b(1) = b(1) + kappa(1)*g(1); b(n+1) = b(n+1) + kappa(2)*g(2); 举个例子:假设我们现在有一维导热方程如下: 边界条件为: 也就是左端是恒定温度边界条件,右端是绝热边界条件。对照之前我们理论推导,设定的边界条件 应该具有下列形式: 两者貌似不一致,怎么回事?——我们之所以用诺依曼边界条件进行推导,是因为微分方程弱形 式进行分部积分的时候会用到诺依曼条件,那假如是别的边界条件怎么办呢?比如本例中的就有狄 利克雷条件: ,这就需要一点数学技巧了! 我们知道,物理模型的量一般都是有界的,不会漫天飞,因此,我们可以认为 个有限值,现在假如 非常大,比如说达到 ,所以只要我们设置 ,那 也是一 要非常接近0才行,于是 即可; 第二个边界条件本身就是诺依曼条件,就简单了,直接设置 即可; 下面我们通过MATLAB来看一下,热源的代码为: https://zhuanlan.zhihu.com/p/56326567 20/28