Предупреждающее сообщение SciPy: «Обнаружена плохо подготовленная матрица» - PullRequest
0 голосов
/ 12 октября 2019

Я использую код, который я изначально разработал с помощью SciPy 0.18. Теперь, используя SciPy 0.19, я часто получаю предупреждающие сообщения, такие как:

/ usr / lib / python3 / dist-packages / scipy / linalg / basic.py: 223: RuntimeWarning: scipy.linalg.solve Illматрица обнаружена. Результат не гарантированно будет точным. Взаимный номер условия: 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 голосов
/ 23 октября 2019

При проверке матрицы с помощью

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, чтобы получить что-то значимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...