使用 Python 计算n阶行列式的多种方法
探讨使用 Python 实现计算 n 阶行列式的多种方法
前些日子刚学线性代数,被手算高阶行列式折磨(主要因为当时才只学了定义),于是想用Python来做验算。自然也就想到了Python强大的第三方科学计算库 —— Numpy。经过一通操作,便有了以下的动态:
以下是输入和输出的结果:
1 | input:[[ 2 1 4 1], |
1 | output: 6.217248937900884e-15 |
但是这个行列式的结果应该是0才对啊!!!
观察 Numpy 计算的结果,猜测可能是浮点数导致的误差。那既然现成的库不靠谱,就只能自己造轮子了。当时我用定义法写了一个简单的小程序。后来随着更深入的学习,我也了解到了更多的计算方法,也翻了一些参考资料,所以今天就来讨论一下计算行列式的多种方法。
我简单总结了一下计算行列式的几种方法,具体如下:
按照以上总结的方法,下面就来一一实现。此处只讨论实现方式,不考虑时间复杂度和优化问题。
一、逆序数法
逆序数法总共分为三步:计算逆序数、计算全排列、通过定义计算结果。
我们将这三步分为三个函数来一步步实现。
首先是计算逆序数,最容易想到的就是这个算法:
1 | def get_t(rank): |
简单解释一下就是从一串数组中挨个遍历每一个数,然后查找该数前面大于该数的数量并且计数。
第二个函数是获得 n 个数的全排列,可以使用递归的方法来解决:确定第1位,对n-1位进行全排列,确定第二位,对n-2位进行全排列……
1 | def get_permutations(rank): |
后来发现还有更简单直接的方法:调用Python的内置库 itertools 来实现:
1 | import itertools |
准备好以上两个函数后就可以根据定义进行计算了:
1 | def calculate_det_1(det): |
二、等价转换法
该方法就是通过不断的变换将行列式转换为上三角形行列式,然后计算对角线的乘积。具体的实现方法如下:
1 |
|
三、代数余子式法
该方法就是将行列式不断降阶,直到变为容易计算的低阶行列式。
该方法比较适合用递归来解决,实现代码如下:
1 |
|
以上就是个人对于使用 Python 计算行列式的三种常用方法的总结,个人能力有限,可能存在错误,欢迎各位指正。
-
感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 BoGe's Blog
评论