我使用numpy来计算对称方阵的特征值和特征向量.我的阵列是:
L = [[ 2. -1. -1. 0. 0. 0.]
[-1. 3. 0. -1. 0. -1.]
[-1. 0. 2. -1. 0. 0.]
[ 0. -1. -1. 3. -1. 0.]
[ 0. 0. 0. -1. 2. -1.]
[ 0. -1. 0. 0. -1. 2.]]
Run Code Online (Sandbox Code Playgroud)
执行时的结果numpy.linalg.eig(L)如下所示
特征值:
[ 5.00000000e+00,
3.96872205e-16,
1.00000000e+00,
2.00000000e+00,
3.00000000e+00,
3.00000000e+00 ]
Run Code Online (Sandbox Code Playgroud)
特征向量:
[[ -2.88675135e-01 4.08248290e-01 -5.00000000e-01 4.08248290e-01 -4.36632863e-01 4.44614891e-01]
[ 5.77350269e-01 4.08248290e-01 -3.34129212e-16 4.08248290e-01 -1.08813217e-01 -5.41271705e-01]
[ 2.88675135e-01 4.08248290e-01 -5.00000000e-01 4.08248290e-01 5.45446080e-01 9.66568140e-02]
[ -5.77350269e-01 4.08248290e-01 1.06732810e-16 4.08248290e-01 -1.08813217e-01 -5.41271705e-01]
[ 2.88675135e-01 4.08248290e-01 5.00000000e-01 4.08248290e-01 -4.36632863e-01 4.44614891e-01]
[ -2.88675135e-01 4.08248290e-01 5.00000000e-01 -4.08248290e-01 5.45446080e-01 9.66568140e-02]]
Run Code Online (Sandbox Code Playgroud)
结果与您在分析计算它们时得到的结果非常接近(如果已标准化),但某些误差似乎在特征值和特征向量中都会引入.有没有办法绕过这些错误使用numpy?
这些错误来自哪里?numpy使用什么算法?
如果您想要分析推导的精度,则需要使用符号计算,这是Wolfram Alpha,Mathematica和相关系统使用的.例如,在Python中,您可能需要查看SymPy.
嵌入到您正在使用的NumPy包中的数值计算固有地受到浮点数值表示的小错误和变化的影响.这种误差和近似值在数值计算中是不可避免的.
这是一个例子:
from sympy import Matrix, pretty
L = Matrix([[ 2, -1, -1, 0, 0, 0,],
[-1, 3, 0, -1, 0, -1,],
[-1, 0, 2, -1, 0, 0,],
[ 0, -1, -1, 3, -1, 0,],
[ 0, 0, 0, -1, 2, -1,],
[ 0, -1, 0, 0, -1, 2,]])
print "eigenvalues:"
print pretty(L.eigenvals())
print
print "eigenvectors:"
print pretty(L.eigenvects(), num_columns=132)
Run Code Online (Sandbox Code Playgroud)
产量:
eigenvalues:
{0: 1, 1: 1, 2: 1, 3: 2, 5: 1}
eigenvectors:
??0, 1, ??1???, ?1, 1, ??-1???, ?2, 1, ??1 ???, ?3, 2, ??1 ?, ?0 ???, ?5, 1, ??1 ????
?? ?? ??? ? ?? ??? ? ?? ??? ? ?? ? ? ??? ? ?? ????
?? ??1??? ? ??0 ??? ? ??1 ??? ? ??-1? ?-1??? ? ??-2????
?? ?? ??? ? ?? ??? ? ?? ??? ? ?? ? ? ??? ? ?? ????
?? ??1??? ? ??-1??? ? ??-1??? ? ??0 ? ?1 ??? ? ??-1????
?? ?? ??? ? ?? ??? ? ?? ??? ? ?? ? ? ??? ? ?? ????
?? ??1??? ? ??0 ??? ? ??-1??? ? ??-1? ?-1??? ? ??2 ????
?? ?? ??? ? ?? ??? ? ?? ??? ? ?? ? ? ??? ? ?? ????
?? ??1??? ? ??1 ??? ? ??-1??? ? ??1 ? ?0 ??? ? ??-1????
?? ?? ??? ? ?? ??? ? ?? ??? ? ?? ? ? ??? ? ?? ????
?? ??1??? ? ??1 ??? ? ??1 ??? ? ??0 ? ?1 ??? ? ??1 ????
Run Code Online (Sandbox Code Playgroud)
虽然ASCII漂亮的打印机,嗯,努力提供甚至准好看的输出,你可以看到你正在获得符号计算,精确的输出.如果您正在使用IPython并将其设置为显示LaTeX输出,那么您将获得更好的显示效果.
看起来它正在使用 LAPACK 的迭代方法。它收敛到一个解。如果不收敛,则抛出异常。
既然你知道矩阵是对称的,你可能会用 eigh 做得更好。 http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigh.html
文档页面:http : //docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html
源代码:https : //github.com/numpy/numpy/blob/v1.9.1/numpy/linalg/linalg.py#L982
| 归档时间: |
|
| 查看次数: |
6424 次 |
| 最近记录: |