贡献者: addis
1我们在前面两节已经讨论了线性方程组的最基本解法--高斯消元法,以及在实际编写算法时需要考虑到的数值问题--Pivoting。
先来看一张图片
这一节我们就来探究一下这张图片的由来,以及它在解线性方程组中的重要意义。
事实上,这张图片是一个
事实上,对于理解本节的内容,甚至整个专栏,同学们并不需要懂得任何固体力学的知识。在这里,我们不会讨论这个跳板模型是如何构造的,甚至这一节也不会讨论是如何从模型离散化成为这样一个五对角矩阵的。关于离散化的内容,涉及到了有限微分和有限元分析,我们会在后面详细讨论。这里我只给出生成这个矩阵的完整代码。
这段代码中 divingboardmatrix(n,L)
会生成一个 loadvector(n, L, p, v, pos)
则会根据板的长度
我们假设板长为 4 米,板头的一端固定,另一端站上四个人,平均 75 公斤。
这段代码的输出结果如下,有兴趣的小伙伴可以尝试着改变人数,重量,放置位置,等等,来测试一下什么时候会掉入水中。
细心的同学可能已经注意到了,在求解线性方程组的时候我都用到了和前面两节不同的函数 scipy.sparse.linalg.spsolve
。这也是我们这一节要讨论的重点,稀疏矩阵形式对求解线性方程组的影响。这种矩阵也是对微分方程离散化后最常见的结果之一。
所谓稀疏矩阵(sparse matrix)就是矩阵中大多数的元素都是 0 的矩阵。对于这类矩阵,通常情况下我们只需要存储那些非 0 的元素和他们所在的行和列的序号,而不必存储所有的 0 元素,这样不仅可以大大的节省存储空间,也会提高运算效率。
我们来看一下,如果我们使用普通的线性方程求解,也就高斯消元法,和利用对角矩阵结构特性的部分消元法的运算时间对比。
注意:小伙伴们可能需要 ipython 或者 jupyter notebook 才能运行下面的计时程序。
这里我们的矩阵尺寸为 1500。
采用高斯消元,运算时间为
对比
针对对角矩阵的算法:
可以明显看到两种算法的运算时间有着巨大的区别。有兴趣的小伙伴也可以按照我讲高斯消元那一节的方式,画出运算时间和矩阵尺寸的关系图。
上面这个例子所用到的五对角矩阵,实际上也可以被理解为是一个稀疏矩阵。对于这样的五对角矩阵而言,如果进行基本的高斯消元或者 LU 分解,我们并不需要完整遍历每一行和每一列。事实上,每一步消元过程只需要对附近的两行两列进行运算,因此这个消元过程的运算复杂度并不是
同样的,对于三对角矩阵,还存在着一种专门针对它的托马斯算法
更普遍的结论是,对于带宽为
1. ^ 本文经作者同意转载自知乎专栏 《科学计算》,格式有少量修改。
友情链接: 超理论坛 | ©小时科技 保留一切权利