本文再次以电磁波在真空中的传播为物理问题,介绍一维有限元中各个阶数之间的精度关系、精度随着网格变化的关系、乘以大数的处理方式对精度的影响并且介绍了一种新的第一类边界条件加载方法。
最后,给出该边值问题的一维有限元代码:其中包括一阶、二阶插值、二阶叠层、三阶叠层有限元。(这部分付费)
该物理问题的边值问题、有限元推导等这里均不再介绍,详细可参考:
一阶有限元参考:最简单的一维有限元问题:求解cos函数分布
二阶插值有限元参考:一维高阶插值基函数有限元实现
二、三阶叠层有限元参考:一维高阶叠层有限元实现
针对如下线性方程组,假设已知第一类边界x1 = p:
常用的第一类方式是乘以大数的处理方式,如下处理:
这种方法即保留了系数矩阵的对称性,又简单容易实现。但是求解结果容易所设置的大数的量级影响,如果大数设置不足够大,会对结果精度造成影响。
新的方式则是避免这种问题,对于求解线性方程组,从线性方程组的角度出发,可以如下处理:
求解该方程组,也能得出x1=p,求解的出正确的结果,但是处理破坏了系数矩阵的对称性,如果使用的求解器需要系数矩阵具有对称性,就需要进一步处理,例如对上述矩阵的第二排乘开,推导如下:
其他排类似处理,重新整理系数矩阵,得到:
这时候系数矩阵重新变成了对称矩阵,已经可以了。如此得到的系数矩阵就不会引入大数,在求解的过程中也不会对精度造成影响。
当然如果是想要继续处理,可以发现第一排第一列的非对角全部为0,也就是第一排与其他排没有关系了,因此可以把第一列第一排去掉,从而还可以减少未知数个数,如下:
对研究区域进行均匀剖分,网格从10~1000,间隔50个网格,依次求解,得出各个阶数的结果,对比其节点、方程未知数、最大误差之间的关系。
其中图中对最大误差取10的对数,以方便对比。
a.单元个数与未知量个数变化的关系
b.单元个数与最大误差变化的关系
阶数越大,精度越高,尤其三阶叠层的精度,在200个网格就能高达1e-10次方,而一阶即使网格足够大,精度变化也非常缓慢,能达到1e-3次方的精度就非常不错了。
c.未知量个数与最大误差变化的关系
虽然高阶导致未知量增加,但是其得到的精度要远远高于同等未知量下低阶的精度。因此从求解线性方程组的角度上来说,高阶有限元的确是必不可少的,其高精度有时候是低阶无法达到的。
a.一阶有限元的精度结果对比
可见,由于一阶有限元的精度最高大概在1e-3次方,因此大数的量级对其影响还是比较小,只有在网格大于600的时候,largenum=1e6才会显示与其他大数量级的结果不同。
b.二阶叠层与插值有限元的精度结果对比
其中,实线为二阶插值基函数结果,虚线为二阶叠层基函数结果。
取不同大数的量级,对于二阶插值与叠层有限元的精度结果影响就很明显,1e6次方的大数精度最大才1e-4,并且随着网格增加,误差有增大的迹象,1e10次方的大数精度高达1e-7但是依旧无法与处理成1的精度对比,只有大数达到1e12次方,结果才与处理成1的精度一致。
同时,叠层与插值受到大数量级的影响效果不一致,这也会让我们对同阶下叠层精度和插值精度的一致性产生怀疑,实际上看处理成1的精度对比,二者的最大误差是一模一样的。
c.三阶叠层有限元结果对比
三阶叠层有限元的精度相差就更加的明显,即使大数取1e10次方,对应的精度在网格100的时候就开始受到影响,只有大数选择1e16次方,才和处理成1的精度完全一致。