我使用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.]]
执行numpy.linalg.eig(L)时的结果如下所示
特征值:
[ 5.00000000e+00,
3.96872205e-16,
1.00000000e+00,
2.00000000e+00,
3.00000000e+00,
3.00000000e+00 ]
特征向量:
[[ -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]]
结果与analytically计算它们时得到的结果很接近(如果标准化),但是在特征值和特征向量中都会出现一些错误.有没有办法绕过这些错误使用numpy?
这些错误来自哪里? numpy使用什么算法?
解决方法:
如果您想要分析推导的精度,则需要使用symbolic computation,这是Wolfram Alpha,Mathematica和相关系统使用的.例如,在Python中,您可能需要查看SymPy.
嵌入到您正在使用的NumPy软件包中的numerical computation固有地受到floating point numerical representations的小错误和变化的影响.这些错误和近似值在数值计算中是不可避免的.
这是一个例子:
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)
产量:
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 ⎦⎦⎠⎦
虽然ASCII漂亮的打印机,嗯,努力提供甚至准好看的输出,你可以看到你正在获得符号计算,精确的输出.如果您正在使用IPython并将其设置为显示LaTeX输出,那么您将使用get a nicer display.
标签:python,numpy 来源: https://codeday.me/bug/20190715/1466558.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。