python numpy linalg求解器:错误的答案

时间:2019-10-17 17:14:42

标签: python numpy matrix linear-algebra

我在使用np.linalg.solve时遇到问题(我也尝试过scipy),但是对于某些线性系统,答案是错误的。在我的程序中生成的系统示例:

  

矩阵A:

     

[[7.03894408e + 00 1.34629120e + 10 2.00000000e + 10 1.14564392e + 10 1.82002747e + 10 1.73205081e + 10]    [1.34629120e + 10 7.03894408e + 00 1.82002747e + 10 2.00000000e + 10 2.23606798e + 10 2.07665597e + 10]    [2.00000000e + 10 1.82002747e + 10 7.03894408e + 00 1.67705098e + 10 1.67705098e + 10 2.23606798e + 10]    [1.14564392e + 10 2.00000000e + 10 1.67705098e + 10 7.03894408e + 00 1.73205081e + 10 1.34629120e + 10]    [1.82002747e + 10 2.23606798e + 10 1.67705098e + 10 1.73205081e + 10 7.03894408e + 00 1.95256242e + 10]    [1.73205081e + 10 2.07665597e + 10 2.23606798e + 10 1.34629120e + 10 1.95256242e + 10 7.03894408e + 00]]

     

向量b:

     

[5.49316406e + 42 9.62786249e + 22 5.49316406e + 42 8.66507624e + 23 1.38770661e + 25 7.66220239e + 24]

     

x = np.linalg.solve(A,b)中的向量x

     

[-4.06597524e + 32 2.80218361e + 32 -2.68178425e + 32 2.82035894e + 32 1.75304606e + 32 3.82470510e + 31]

     来自np.dot(A,x)的

A * x应该等于b

     

[5.49316406e + 42 9.28455029e + 26 5.49316406e + 42 6.18970020e + 26 -6.18970020e + 26 -1.23794004e + 27]

对于某些系统,向量b和A * x中相等的元素数量更多

  

一些验证:

     

条件编号:np.linalg.cond(A)= 11.283698804140434

     

A的决定因素:np.linalg.det(A)= -1.146617874355366e + 62

     

A的范数:np.linalg.norm(A)= 99310120330.20604

     

inv(A)的范数:np.linalg.norm(np.linalg.inv(A))= 1.6365102872452848e-10

某些系统还可以,求解器给出正确的答案。

谢谢。

1 个答案:

答案 0 :(得分:2)

您得到的答案是 not 错误。确实,将原始b与重建的br ...

A
# array([[7.03894408e+00, 1.34629120e+10, 2.00000000e+10, 1.14564392e+10,
#         1.82002747e+10, 1.73205081e+10],
#        [1.34629120e+10, 7.03894408e+00, 1.82002747e+10, 2.00000000e+10,
#         2.23606798e+10, 2.07665597e+10],
#        [2.00000000e+10, 1.82002747e+10, 7.03894408e+00, 1.67705098e+10,
#         1.67705098e+10, 2.23606798e+10],
#        [1.14564392e+10, 2.00000000e+10, 1.67705098e+10, 7.03894408e+00,
#         1.73205081e+10, 1.34629120e+10],
#        [1.82002747e+10, 2.23606798e+10, 1.67705098e+10, 1.73205081e+10,
#         7.03894408e+00, 1.95256242e+10],
#        [1.73205081e+10, 2.07665597e+10, 2.23606798e+10, 1.34629120e+10,
#         1.95256242e+10, 7.03894408e+00]])
b
# array([5.49316406e+42, 9.62786249e+22, 5.49316406e+42, 8.66507624e+23,
#        1.38770661e+25, 7.66220239e+24])

br = A@np.linalg.solve(A,b)

abserr = np.sqrt((br-b)@(br-b))
relerr = abserr / np.sqrt(b@b) 
relerr
# 4.914258035606803e-16

...我们得到的相对误差约为机器精度的2.2倍...

np.finfo(float).eps
# 2.220446049250313e-16

...实际上非常准确。