在 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 范式的主要内容,如果未能解决你的问题,请参考以下文章