【发布时间】:2017-09-16 12:49:38
【问题描述】:
我正在进行的一些研究需要象征性地采用大矩阵的行列式;矩阵范围从 18x18 到 318x318。矩阵条目是同一变量omega 中的数值或二次多项式。
目前,我正在尝试在 SymPy 中使用 .det() 方法,但速度很慢;一个 18x18 矩阵现在已经运行了 45 多分钟,并且在我写这篇文章时仍在计算。我意识到行列式计算非常密集,但是我能做些什么来加快速度吗?
我已经阅读了Speeding up computation of symbolic determinant in SymPy 的帖子,但没有从帖子中删除任何关于实际可以做什么来加快进程的内容。我能做些什么?
【问题讨论】:
-
是什么让您认为这是可能的?密集符号 NxN 矩阵的行列式具有
math.factorial(N)项。因此,例如,对于 18x18 矩阵,这是 6,402,373,705,728,000 个术语。我想说我们会在那之前死掉,除非你在那之前很久就会用完 RAM ;-) -
@TimPeters:我认为这应该是一个答案。
-
@TimPeters,我不确定你从哪里得到 N 阶乘,但是有比标准的辅因子展开更有效的算法来计算行列式。例如,使用 LU 分解可以大大减少计算大型矩阵的行列式所需的计算开销。对于 15x15 矩阵,使用辅因子展开计算行列式将需要约 2.3 万亿次乘法。使用 LU 分解将只需要大约 1100 次乘法来计算行列式。必须有一些东西我可以改变以使它运行得更快。
-
看来你的矩阵有特殊的结构:它不像带有符号 a,b,c,d 的 [[a,b],[c,d]] 而是更像 [[x+1 , x], [x-1, x-3]],矩阵中有一个符号。这很重要,因为答案确实要小得多,并且可以希望优化计算。请编辑您的问题以描述符号矩阵的结构。
-
好的,但如果这些完全是 omega 的通用函数,则不能指望行列式有任何简化。它们是欧米茄的线性函数,还是其他次数的多项式?系数是整数还是浮点数?
标签: python matrix sympy determinants