【问题标题】:Diagonalize symbolic matrix对角化符号矩阵
【发布时间】:2013-09-13 04:19:50
【问题描述】:

我需要用 python 对一个符号矩阵进行对角化。在 Mathematica 中可以轻松完成,但使用模块 numpy.linalg 时出现问题。

为了具体,考虑矩阵

[[2, x], [x, 3]]

其中x 是一个符号变量。我想我遇到了问题,因为 numpy 包是为数值计算提供的,而不是符号的,但我找不到如何用 sympy 来做。

【问题讨论】:

  • 如果你创建x = sympy.Symbol('x'),然后初始化一个numpy矩阵为A = np.array([[2, x], [x, 3]])呢?
  • @Bill 这失败了,因为 numpy 无法安全地将类型强制转换为它可以处理的东西。
  • Matrix([[2,x],[x,3]]).diagonalize() 应该足够了。不要为此使用 numpy,即使您使用 dtype=object,数值算法也完全不适合符号计算。
  • @Krastanov,你能解释一下为什么我使用 Matrix([[2,x],[x,3]]).diagonalize() 得到两个矩阵吗?第二个是正确的,但不知道第一个。谢谢
  • @dapias 看到我的回答。

标签: python numpy matrix sympy diagonal


【解决方案1】:

您可以根据特征值计算它,但实际上有一种方法可以为您计算,diagonalize

In [13]: M.diagonalize()
Out[13]:
⎛                                        ⎡     __________                       ⎤⎞
⎜                                        ⎢    ╱    2                            ⎥⎟
⎜⎡      -2⋅x                2⋅x       ⎤  ⎢  ╲╱  4⋅x  + 1    5                   ⎥⎟
⎜⎢─────────────────  ─────────────────⎥, ⎢- ───────────── + ─          0        ⎥⎟
⎜⎢   __________         __________    ⎥  ⎢        2         2                   ⎥⎟
⎜⎢  ╱    2             ╱    2         ⎥  ⎢                                      ⎥⎟
⎜⎢╲╱  4⋅x  + 1  - 1  ╲╱  4⋅x  + 1  + 1⎥  ⎢                        __________    ⎥⎟
⎜⎢                                    ⎥  ⎢                       ╱    2         ⎥⎟
⎜⎣        1                  1        ⎦  ⎢                     ╲╱  4⋅x  + 1    5⎥⎟
⎜                                        ⎢         0           ───────────── + ─⎥⎟
⎝                                        ⎣                           2         2⎦⎠

M.diagonalize() 返回一对矩阵(P, D),使得M = P*D*P**-1。如果它不能计算出足够多的特征值,要么是因为矩阵不可对角化,要么是因为solve() 找不到特征多项式的所有根,它将引发MatrixError

另请参阅 SymPy 教程的 this section

【讨论】:

    【解决方案2】:

    假设矩阵是可对角化的,则可以得到特征向量和特征值

    from sympy import *
    x = Symbol('x')
    M = Matrix([[2,x],[x,3]])
    print M.eigenvects()
    print M.eigenvals()
    

    给予:

    [(-sqrt(4*x**2 + 1)/2 + 5/2, 1, [[-x/(sqrt(4*x**2 + 1)/2 - 1/2)]
    [                            1]]), (sqrt(4*x**2 + 1)/2 + 5/2, 1, [[-x/(-sqrt(4*x**2 + 1)/2 - 1/2)]
    [                             1]])]
    {sqrt(4*x**2 + 1)/2 + 5/2: 1, -sqrt(4*x**2 + 1)/2 + 5/2: 1}
    

    您应该查看documentation,那里列出了许多其他分解。

    请注意,并非每个矩阵都是可对角化的,但您可以使用 sympy 命令 .jordan_form 将每个矩阵放入 Jordan Normal Form

    【讨论】:

    • 谢谢Hooked,但现在我很困惑,如果矩阵是2x2,为什么我们得到特征向量的三个分量。假设特征向量的维数不能大于矩阵。你怎么看?
    • 您已链接到文档的过期版本。将url中的版本替换为“latest”即可获取最新版本。
    • @asmeurer 已修复,谢谢,我不知道。这是否特定于它正在运行的后端,即这是否适用于其他网站?
    • @dapias 来自文档:返回三个值“三元组列表(特征值、多重性、基础)”。如果您只对对角化感兴趣,那么 asmeurer 的答案会更好(但请注意 Jordan Normal 形式!)。
    • 上钩不,这是 SymPy 文档实现的东西。后端只是托管在 github 页面上的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2013-02-07
    • 2016-12-03
    相关资源
    最近更新 更多