SciPy警告消息:“检测到病态矩阵”

时间:2019-10-12 15:56:14

标签: python scipy

我正在运行一些最初由SciPy 0.18开发的代码。现在使用SciPy 0.19时,我经常会收到如下警告消息:

  

/usr/lib/python3/dist-packages/scipy/linalg/basic.py:223:   运行时警告:scipy.linalg.solve检测到病态条件矩阵。   结果不保证是准确的。互惠条件编号:   1.8700410190617105e-17'条件编号:{}'。format(rcond),RuntimeWarning)

这是一个生成上面消息的小片段:

from scipy import interpolate
xx = [0.5, 0.5, 0.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5]
yy = [2.5, 1.5, 0.5, 2.5, 1.5, 0.5, 2.5, 1.5, 0.5]
vals = [30.0, 20.0, 10.0, 31.0, 21.0, 11.0, 32.0, 22.0, 12.0]
f = interpolate.Rbf(xx, yy, vals, epsilon=100)

尽管发出警告,结果还是正确的。是什么导致此警告?可以以某种方式抑制它吗?

1 个答案:

答案 0 :(得分:0)

使用

检查矩阵时
numpy.linalg.cond(f.A)
6.213533820748747e+16

您会发现它的条件编号在机器精度范围内,这意味着您的解决方案不包含有效数字。尝试,例如

b = numpy.random.rand(f.A.shape[0])
x = numpy.linalg.solve(f.A, b)
print(numpy.dot(f.A, x) - b)
[-0.22342786 -0.06718507 -0.13027724 -0.09972579 -0.16589076 -0.06328093
  0.05480577 -0.12606864  0.02067541]

如果x确实是一个解决方案,那么所有这些数字都将接近0。请在epsilon上轻松获得有意义的东西。