Номер условия матрицы с использованием 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
который либо выдаст ошибку для точной сингулярности, либо предупреждение, если число взаимных условий ниже порогового значения, и ничего, если массив обратим.