在 Python / NumPy 中计算矩阵的 Jordan 范式

Posted

技术标签:

【中文标题】在 Python / NumPy 中计算矩阵的 Jordan 范式【英文标题】:Compute Jordan normal form of matrix in Python / NumPy 【发布时间】:2013-12-17 05:05:09 【问题描述】:

在 MATLAB 中,您可以使用函数 jordan 计算矩阵的 Jordan 范式。

NumPy 和 SciPy 中是否有等效的功能?

【问题讨论】:

在 sage 中,您正在寻找 jordan_form,请参阅 here。不过,这不是 scipy/numpy。 只是一个评论:乔丹形式计算在浮点数上是不稳定的——你可以例如尝试计算 4x4 矩阵 in sympy jordan_form docs 的特征值。 LAPACK(以及因此 Scipy)将报告它有 4 个不同的特征值。然而,精确算术给出了 2 的 4 倍退化特征值。 【参考方案1】:

有this 实现。

不过,它肯定不会像 MATLAB 那样快。

【讨论】:

将矩阵转换为简化的行回声形式,可以使用 sympy.Matrix(...).rref() 更有效地完成但是,我正在寻找约旦范式:@ 987654322@【参考方案2】:

MATLAB jordan function 来自 Symbolic Math Toolbox,因此从 SymPy 库中获取它的 Python 替代品似乎并非不合理。具体来说,Matrix 类具有方法jordan_form。创建 sympy 矩阵时,可以将 numpy 数组作为参数传递。例如,以下来自wikipedia article on the Jordan normal form:

In [1]: import numpy as np

In [2]: from sympy import Matrix

In [3]: a = np.array([[5, 4, 2, 1], [0, 1, -1, -1], [-1, -1, 3, 0], [1, 1, -1, 2]])

In [4]: m = Matrix(a)

In [5]: m
Out[5]: 
Matrix([
[ 5,  4,  2,  1],
[ 0,  1, -1, -1],
[-1, -1,  3,  0],
[ 1,  1, -1,  2]])

In [6]: P, J = m.jordan_form()

In [7]: J
Out[7]: 
Matrix([
[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 4, 1],
[0, 0, 0, 4]])

【讨论】:

只是一个评论:乔丹形式计算在浮点数上是不稳定的——你可以例如尝试计算 4x4 矩阵 in sympy jordan_form docs 的特征值。 LAPACK(因此 Scipy)将报告它有 4 个不同的特征值。然而,精确算术给出了 2 的 4 倍退化特征值。

以上是关于在 Python / NumPy 中计算矩阵的 Jordan 范式的主要内容,如果未能解决你的问题,请参考以下文章

python 科学计算库NumPy—矩阵运算

Numpy 常用矩阵计算函数

python的科学计算库都有哪些

python与数据分析Numpy数值计算基础——补充

Python科学计算类库

NumPy库实现矩阵计算