Номер условия матрицы с использованием numpy

[python 2.7 и numpy v1.11.1] Я смотрю на номера условий матрицы и пытаюсь вычислить номер условия для матрицы без использования функции np.linalg.cond(),

Основываясь на документации numpy, определение номера условия матрицы является "нормой x, умноженной на норму обратного x".

||X|| * ||X^-1||

для матрицы

a = np.matrix([[1, 1, 1],
               [2, 2, 1],
               [3, 3, 0]])

print np.linalg.cond(a)

1.84814479698e + 16

print np.linalg.norm(a) * np.linalg.norm(np.linalg.inv(a))

2.027453660713377e + 17

Где ошибка в моих вычислениях?

Спасибо!

3 ответа

Решение

Вы пытаетесь вычислить условие, используя определение нормы Фробениуса. Это необязательный параметр для вычисления условия.

print(np.linalg.norm(a)*np.linalg.norm(np.linalg.inv(a)))
print(np.linalg.cond(a, p='fro'))

Производит

2.02745366071e+17
2.02745366071e+17

norm по умолчанию использует норму Фробениуса для матрицы, когда cond использует 2-норму:

In [347]: np.linalg.cond(a)
Out[347]: 38.198730775206172

In [348]:np.linalg.norm(a,2)*np.linalg.norm(np.linalg.inv(a),2)
Out[348]: 38.198730775206243

In [349]: np.linalg.norm(a)*np.linalg.norm(np.linalg.inv(a))
Out[349]: 39.29814570824248

NumPy cond () в настоящее время глючит. Придет время, когда мы это исправим, но сейчас, если вы делаете это для решений линейных уравнений, вы можете использовать SciPy linalg.solve который либо выдаст ошибку для точной сингулярности, либо предупреждение, если число взаимных условий ниже порогового значения, и ничего, если массив обратим.

Другие вопросы по тегам