我正在使用渐近最后版本1.12计算矩阵的特征值:

from sympy import Matrix
M = Matrix( [[0, 1.0, 0, 1.0], [1.0, 0, -0.50, 0], [0, 1.0, 0, -1.0], [-0.50, 0, 1.0, 0]])
M.eigenvals()

假设M是实数,则本征值应该出现在共轭对中,但我得到以下输出:

{3.49869741491636e-64 - 1.35013912450988*I: 1, -0.907124939317785 + 3.82549612092643e-64*I: 1, 0.907124939317785 + 9.90959643144198e-65*I: 1, 1.35013912450988*I: 1}

这是一个精度问题,还是有什么我没有考虑到的?

推荐答案

除了有小的浮点误差外,本征值都是复数共轭对:

3.49869741491636e-64 - 1.35013912450988*I
-0.907124939317785 + 3.82549612092643e-64*I
0.907124939317785 + 9.90959643144198e-65*I
1.35013912450988*I

你应该认为e-64的微小数字基本上就是零,这意味着这里的本征值实际上是:

-1.35013912450988*I
-0.907124939317785
0.907124939317785
1.35013912450988*I

所以这里的第二个和第三个值是实数,第一个和第四个是虚数复数共轭对.

计算是近似的原因是因为您使用的是浮点数矩阵.如果你使用精确有理数,那么你可以得到特征值的精确表示:

In [6]: M
Out[6]: 
⎡ 0    1.0   0    1.0 ⎤
⎢                     ⎥
⎢1.0    0   -0.5   0  ⎥
⎢                     ⎥
⎢ 0    1.0   0    -1.0⎥
⎢                     ⎥
⎣-0.5   0   1.0    0  ⎦

In [7]: M.applyfunc(nsimplify)
Out[7]: 
⎡ 0    1   0    1 ⎤
⎢                 ⎥
⎢ 1    0  -1/2  0 ⎥
⎢                 ⎥
⎢ 0    1   0    -1⎥
⎢                 ⎥
⎣-1/2  0   1    0 ⎦

In [8]: M.applyfunc(nsimplify).eigenvals()
Out[8]: 
⎧       ________           ________          __________         __________   ⎫
⎪      ╱ 1   √7           ╱ 1   √7          ╱   1   √7         ╱   1   √7    ⎪
⎨-ⅈ⋅  ╱  ─ + ── : 1, ⅈ⋅  ╱  ─ + ── : 1, -  ╱  - ─ + ── : 1,   ╱  - ─ + ── : 1⎬
⎪   ╲╱   2   2         ╲╱   2   2        ╲╱     2   2       ╲╱     2   2     ⎪
⎩                                                                            ⎭

如果您准确地计算特征值,则可以在没有微小舍入误差的情况下对它们进行数值计算:

In [15]: [r.n() for r in M.applyfunc(nsimplify).eigenvals()]
Out[15]: [-1.35013912450988⋅ⅈ, 1.35013912450988⋅ⅈ, -0.907124939317785, 0.907124939317785]

Python相关问答推荐

使用Keras的线性回归参数估计

TARete错误:类型对象任务没有属性模型'

试图找到Python方法来部分填充numpy数组

从numpy数组和参数创建收件箱

为什么这个带有List输入的简单numba函数这么慢

如何让Flask 中的请求标签发挥作用

形状弃用警告与组合多边形和多边形如何解决

如何指定列数据类型

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

如何使regex代码只适用于空的目标单元格

Polars map_使用多处理对UDF进行批处理

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

如何在Airflow执行日期中保留日期并将时间转换为00:00

如何设置nan值为numpy数组多条件

为什么在Python中00是一个有效的整数?

有了Gekko,可以创建子模型或将模型合并在一起吗?

极点用特定值替换前n行

我可以同时更改多个图像吗?

关于数字S种子序列内部工作原理的困惑

合并Pandas中的数据帧,但处理不存在的列