[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))
A +027453660713377 + 17
我的计算中的错误在哪里?
谢谢!
您正尝试使用Frobenius Norm定义计算条件。这是条件计算的可选参数。
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
当cond使用2范数时,norm
默认使用Frobenius范数作为矩阵:
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
,它会产生精确奇点的错误,或者如果倒数条件数低于阈值则发出警告,如果是阵列是可逆的。