python numpy linalg 求解器:错误答案
python numpy linalg solver: Wrong answer
我在使用 np.linalg.solve 时遇到问题(我也尝试过使用 scipy),但某些线性系统的答案是错误的。在我的程序中生成的系统示例:
Matrix 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]]
Vector b:
[5.49316406e+42 9.62786249e+22 5.49316406e+42 8.66507624e+23 1.38770661e+25 7.66220239e+24]
Vector x from x = np.linalg.solve(A, b)
[-4.06597524e+32 2.80218361e+32 -2.68178425e+32 2.82035894e+32 1.75304606e+32 3.82470510e+31]
A*x from np.dot(A, x) that should be equal to b
[ 5.49316406e+42 9.28455029e+26 5.49316406e+42 6.18970020e+26 -6.18970020e+26 -1.23794004e+27]
对于某些系统,向量 b 和 A*x 中相等的元素数量更多
some verifications:
conditional number: np.linalg.cond(A) = 11.283698804140434
determinant of A: np.linalg.det(A) = -1.146617874355366e+62
norm of A: np.linalg.norm(A) = 99310120330.20604
norm of inv(A): np.linalg.norm(np.linalg.inv(A)) = 1.6365102872452848e-10
有些系统没问题,求解器给出了正确的答案。
谢谢。
您得到的答案没有错误。事实上,比较原始的 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
...这实际上是相当准确的。
我在使用 np.linalg.solve 时遇到问题(我也尝试过使用 scipy),但某些线性系统的答案是错误的。在我的程序中生成的系统示例:
Matrix 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]]
Vector b:
[5.49316406e+42 9.62786249e+22 5.49316406e+42 8.66507624e+23 1.38770661e+25 7.66220239e+24]
Vector x from x = np.linalg.solve(A, b)
[-4.06597524e+32 2.80218361e+32 -2.68178425e+32 2.82035894e+32 1.75304606e+32 3.82470510e+31]
A*x from np.dot(A, x) that should be equal to b
[ 5.49316406e+42 9.28455029e+26 5.49316406e+42 6.18970020e+26 -6.18970020e+26 -1.23794004e+27]
对于某些系统,向量 b 和 A*x 中相等的元素数量更多
some verifications:
conditional number: np.linalg.cond(A) = 11.283698804140434
determinant of A: np.linalg.det(A) = -1.146617874355366e+62
norm of A: np.linalg.norm(A) = 99310120330.20604
norm of inv(A): np.linalg.norm(np.linalg.inv(A)) = 1.6365102872452848e-10
有些系统没问题,求解器给出了正确的答案。
谢谢。
您得到的答案没有错误。事实上,比较原始的 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
...这实际上是相当准确的。