scipy和numpy中与特征值问题相关的函数

(原文写于2013-1-4 ,发布于振动论坛,算法及编程语言分区)
(重编辑于2015-11-15,修正了一些错误,增补了一些讨论)

结构力学、固体力学和声学中的很多方面都对应于特征值问题的计算。比如自由振动、频散曲线、模型压缩、阻尼识别等。有些方面对应于标准特征值问题(复模态分析、频散曲线计算的传递矩阵形式等),有些对应于广义特征值问题(无阻尼模态,频散曲线计算的改进形式等)。在一些场合,还需要计算左特征值问题,例如不对称非比例阻尼在复模态分析中的处理。同时,有些问题中只涉及实数矩阵,另一些问题涉及复数矩阵。同时还涉及矩阵是否对称、是否正定,其求解结果是否需要所有特征值等等特定考虑。在Python的scipy以及numpy库中一搜,你会发现有许多可以计算特征值问题的函数,它们各自的功能、参数和返回值形式都各有异同。因此我做了一个表格,将这些函数整理起来,方便查询。

table

图中绿色的部分就是该函数所具有的特性。
PYTHON中与特征值相关的函数是该表格的PDF版本。

比较重要的四个特性是:
1)可以计算广义右特征值问题。对于任何一个广义左特征值问题,都可以稍作处理,对应于一个广义右特征值问题。而标准左/右特征值问题可视作广义左/右特征值问题中,B矩阵为单位阵的一种特例。因此,如果一个函数可以计算广义右特征值问题,就可以计算表中的四种问题。注意,A, B矩阵不一定可逆,因此并不能精确地经由矩阵逆来用一个只能计算标准特征值问题的函数来计算广义特征值问题。
2)可以处理一般形式的矩阵。即对A,B矩阵无对称行,必须是实数等限制。
3)对A, B矩阵正定性限制。这一条虽然可以归于第二点之中,但是由于它实在是太重要了,所以单列出来。以结构动力学分析中的模态分析为例,如果对A, B矩阵的正定性无限制,意味着可以直接处理a)具有无质量自由度的和b)具有不完整约束的系统。如果不支持这一特性,虽然也有一些解决办法,但总是增加了外部编码的复杂度。
4)可以只计算一部分特征值。这对于大型矩阵是尤其重要的,通常关心的也就是最小或者最大的那些特征值和特征向量。如果可以只计算这一部分,对计算速度的提升是非常显著性的。

综合这些特性。可以看到,numpy库中的函数功能都较弱,甚至都无法计算广义特征值问题。四大重要特性只满足了一个。而scipy库中的函数则十分全面,甚至scipy.linalg库的函数还具有通过重用输入数据空间来加速计算的功能。

纵观这些函数,有两个值得关注,一是scipy.linalg.eig(),另一个是scipy.sparse.eigs()。它们两个都“差一点”就完成了对四大重要功能的大包大揽,前者只差“部分求解”功能;后者却对B矩阵有对称性要求。在实际中,如果矩阵规模大,就应尽量构造满足scipy.sparse.eigs()的输入数据,不然就只能试试scipy.linalg.eig(),由于被迫计算出所有特征值,速度会较慢。

从原理上来讲,之所有scipy.sparse.eigs()能部分求解特征值和特征向量,是因为它采用了Lanczos法,一种子空间迭代的近似方法。具体的原理和技术问题在这里不作展开论述了。

未知 的头像

About 范雨

Talk is cheap. Show me the code.
此条目发表在特征值问题, 数值计算分类目录。将固定链接加入收藏夹。

1 Response to scipy和numpy中与特征值问题相关的函数

  1. Pingback: 几个特征值求解函数的性能比较 | Dynamics and Python

留下评论