python?

Tags: 矩陣, 正定,

正定矩陣的定義是: 設M是n階方陣,如果對任何非零向量z,都有 z'Mz > 0,其中z' 表示z的轉置,就稱M正定矩陣。 這個定義你先搞懂,不懂的看課本去,我這裡就直接用python來檢驗某個方陣是不是正定矩陣(用二維陣列表示矩陣)。

我們用到的一個重要性質是: 判定定理1:對稱陣A為正定的充分必要條件是:A的特徵值全為正 。所以我們只要求得對稱陣A的所有特徵值即可。

引入numpy模組

建立一個方陣A

將方陣轉換成對稱陣的方法是:

求對稱陣A的特徵值

判斷是不是所有的特徵值都大於0,用到了all函式,顯然對稱陣A不是正定的

我們來建立一個單位矩陣,它肯定是對稱的,同樣的方法檢驗是不是正定矩陣

網上查到更簡便的方法是對對稱陣進行cholesky分解,如果像這樣沒有提示出錯,就說明它是正定的

如果提示出錯,就說明它不是正定矩陣,你可以使用try函式捕獲錯誤值

以下是今天用到的部分程式碼:

>>> import numpy

>>>

>>>

>>> A=range(16)

>>> A

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

>>> A=numpy.array(A).reshape(4,4)

>>> A

array([[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11],

[12, 13, 14, 15]])

>>> A=A+A.T

>>> A

array([[ 0, 5, 10, 15],

[ 5, 10, 15, 20],

[10, 15, 20, 25],

[15, 20, 25, 30]])

>>>

>>>

>>> B=numpy.linalg.eigvals(A)

>>> B

array([ 6.74165739e+01 +0.00000000e+00j,

-7.41657387e+00 +0.00000000e+00j,

-8.88285420e-17 +1.82759332e-15j, -8.88285420e-17 -1.82759332e-15j])

>>> if numpy.all(B>0):print '是正定矩陣'

>>> C=numpy.linalg.cholesky(A)

Traceback (most recent call last):

File " ", line 1, in

C=numpy.linalg.cholesky(A)

File "D:Python27libsite-packages
umpy-1.8.0-py2.7-win-amd64.egg
umpylinalglinalg.py", line 603, in cholesky

return wrap(gufunc(a, signature=signature, extobj=extobj).astype(result_t))

File "D:Python27libsite-packages
umpy-1.8.0-py2.7-win-amd64.egg
umpylinalglinalg.py", line 93, in _raise_linalgerror_nonposdef

raise LinAlgError("Matrix is not positive definite")

LinAlgError: Matrix is not positive definite

>>> A=numpy.eye(4)

>>> A

array([[ 1., 0., 0., 0.],

[ 0., 1., 0., 0.],

[ 0., 0., 1., 0.],

[ 0., 0., 0., 1.]])

>>>

>>> B=numpy.linalg.eigvals(A)

>>> B

array([ 1., 1., 1., 1.])

>>> if numpy.all(B>0):print '是正定矩陣'

是正定矩陣

>>>

>>>

>>> C=numpy.linalg.cholesky(A)

>>> C

array([[ 1., 0., 0., 0.],

[ 0., 1., 0., 0.],

[ 0., 0., 1., 0.],

[ 0., 0., 0., 1.]])

>>>

原作者: Delta資料工作室 python 線性代數 (共22篇) 上一篇:求方陣的特徵值特... 下一篇:求協方差矩陣

相關問題答案