我正在运行一些最初由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)
尽管发出警告,结果还是正确的。是什么导致此警告?可以以某种方式抑制它吗?
答案 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
上轻松获得有意义的东西。