2
votes

I am running some code that I originally developed with SciPy 0.18. Now using SciPy 0.19 I often get warning messages like this:

/usr/lib/python3/dist-packages/scipy/linalg/basic.py:223: RuntimeWarning: scipy.linalg.solve Ill-conditioned matrix detected. Result is not guaranteed to be accurate. Reciprocal condition number: 1.8700410190617105e-17 ' condition number: {}'.format(rcond), RuntimeWarning)

Here is a small snippet that generates the message above:

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)

In spite of the warning the results are correct. What is causing this warning? Can it be suppressed somehow?

1

1 Answers

2
votes

When inspecting the matrix with

numpy.linalg.cond(f.A)
6.213533820748747e+16

you'll find that its condition number is in the range of machine precision, meaning that your solution contains no significant digits.
Try, e.g.,

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]

If x was indeed a solution, all those numbers would be close to 0. Take it easy on the epsilon to get something meaningful.