python 线性代数:[11]判断正定矩阵

 时间:2024-10-17 11:46:17

正定矩阵的定义是:设M是n阶方阵,如果对任何非零向量z,都有 z'Mz > 0,其中z' 表示z的转置,就称M正定矩阵。这个定义你先搞懂,不懂的看课本去,我这里就直接用python来检验某个方阵是不是正定矩阵(用二维数组表示矩阵)。

我们用到的一个重要性质是:判定定理1:对称阵A为正定的充分必要条件是:A的特征值全为正。所以我们只要求得对称阵A的所有特征值即可。

引入numpy模块

python 线性代数:[11]判断正定矩阵

创建一个方阵A

python 线性代数:[11]判断正定矩阵
python 线性代数:[11]判断正定矩阵

将方阵转换成对称阵的方法是:

python 线性代数:[11]判断正定矩阵

求对称阵A的特征值

python 线性代数:[11]判断正定矩阵

判断是不是所有的特征值都大于0,用到了all函数,显然对称阵A不是正定的

python 线性代数:[11]判断正定矩阵

我们来创建一个单位矩阵,它肯定是对称的,同样的方法检验是不是正定矩阵

python 线性代数:[11]判断正定矩阵

网上查到更简便的方法是对对称阵进行cholesky分解,如果像这样没有提示出错,就说明它是正定的

python 线性代数:[11]判断正定矩阵

如果提示出错,就说明它不是正定矩阵,你可以使用try函数捕获错误值

python 线性代数:[11]判断正定矩阵

以下是今天用到的部分代码:

>>> 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 "<pyshell#41>", line 1, in <module>

C=numpy.linalg.cholesky(A)

File "D:Python27libsite-packagesumpy-1.8.0-py2.7-win-amd64.eggumpylinalglinalg.py", line 603, in cholesky

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

File "D:Python27libsite-packagesumpy-1.8.0-py2.7-win-amd64.eggumpylinalglinalg.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.]])

>>>

  • 怎样使用VBA选择字体为蓝色之单元格?
  • 如何设置浮点数格式?
  • Oracle如何锁定用户
  • java 如何下载在java项目中的文件
  • 如何将listbox内容赋值到二维数组
  • 热门搜索
    感恩父母的手抄报 三年级手抄报大全 清明节的手抄报三年级 元宵节手抄报 一等奖 古诗文手抄报 中国梦 手抄报 教师节手抄报模板 手抄报边框图片大全 英语手抄报题目 防地震手抄报