Python:使用Numpy解决线性代数问题

常见的矩阵操作,矩阵转置、逆矩阵、伴随矩阵、方阵的迹、行列式、范数

# -*- coding: utf-8 -*-
"""
Created on Mon Oct  8 16:02:57 2018
Python 3.6
scipy 1.1.0
@author: hanzi5
"""
import numpy as np
import scipy as sc
from scipy import linalg

#A=np.mat([[4,-2],[3,-1]])
A=np.mat([[4,2,-5],[6,4,-9],[5,3,-7]],dtype=int)

A.A # 返回自身数据的2维数组的一个视图(没有做任何的拷贝);矩阵->数组变换
A.T # 返回自身的转置
A.H # 返回自身的共轭转置,实数等同于T
A.I # 返回自身的逆矩阵
B=np.linalg.inv(A) # 返回自身的逆矩阵(np中的函数)
A_abs=np.linalg.det(np.round(A)) #使用linalg.det求得方阵的行列式
A_bansui=B*A_abs # 求A矩阵的伴随矩阵

A.trace() #计算A的迹,方阵的迹就是主对角元素之和
np.linalg.det(A) #返回的是矩阵a的行列式
np.linalg.norm(A,ord=None) #计算矩阵a的范数
np.linalg.eig(A) #矩阵a的特征值和特征向量
np.linalg.cond(A,p=None) #矩阵a的条件数
np.linalg.inv(A) #矩阵a的逆矩阵
np.linalg.matrix_rank(A) #矩阵的秩,矩阵排除线性相关后不为0的行

求解矩阵的特征值及特种向量,检测计算结果是否正确

# 矩阵的特征值及特征向量求解
x = np.diag((1, 2, 3))#创建一个对角矩阵!
a,b = np.linalg.eig(x)#特征值保存在a中,特征向量保存在b中
np.linalg.eigvals(A) # 特征值

#根据公式 Ax = λx 检验特征值与特征向量是否正确:
for i in range(3):#方法一
    if np.allclose(np.dot(a[i], b[:, i]), x[:, i]):#np.allclose()
        print( 'Right')
    else:
        print( 'Error')

for i in range(3):#方法二
    if (np.dot(a[i], b[:, i]) == x[:, i]).all():
        print( 'Right')
    else:
        print( 'Error')

# 矩阵LU分解
l,u = sc.linalg.lu(A,True)

矩阵常见的加减乘除操作(matrix和array对比)

# 矩阵加减乘除
A = np.mat([[1, 2, 3], [3, 4, 5], [6, 7, 8]])#使用mat函数
B = np.mat([[5, 4, 2], [1, 7, 9], [0, 4, 5]])
C = np.array([[1, 2, 3], [3, 4, 5], [6, 7, 8]])
D = np.array([[5, 4, 2], [1, 7, 9], [0, 4, 5]])
# 矩阵的加法运算
A+B
C+D

# 矩阵的减法运算
A-B
C-D

# 矩阵乘法
A*B #matrix类型可以直接相乘
np.dot(C, D) # array类型不能用直接相乘,需要用函数

# 矩阵除法,A/B=A*(B')
A*B.I
A*np.linalg.inv(B)

矩阵转置的一些特性验证

# 验证矩阵转置的性质:(A±B)'=A'±B'
(A + B).T
A.T + B.T

#验证矩阵转置的性质:(KA)'=KA'
10 * (A.T)
(10 * A).T

#验证矩阵转置的性质:(A×B)'= B'×A'
(A*B).T
B.T*A.T

矩阵是否是正定矩阵判断

#判断正定矩阵##############################################################
'''设M是n阶方阵,如果对任何非零向量z,都有z'Mz> 0,其中z' 表示z的转置,就称M正定矩阵。
判定定理1:对称阵A为正定的充分必要条件是:A的特征值全为正。
判定定理2:对称阵A为正定的充分必要条件是:A的各阶顺序主子式都为正。
判定定理3:任意阵A为正定的充分必要条件是:A合同于单位阵。
下面用定理1判断对称阵是否为正定阵'''
A = np.arange(16).reshape(4, 4)
A = A + A.T #将方阵转换成对称阵
B = np.linalg.eigvals(A)#求A的特征值,结果存储到B中,注意:eig()是求特征值特征向量
if np.all(B>0):             #判断是不是所有的特征值都大于0,用到了all函数,显然对称阵A不是正定的
    print( 'Yes')
else:
    print('No')

# 创建一个对角元素都为正的对角阵,它一定是正定的:
A = np.diag((1, 2, 3))#创建对角阵,其特征值都为正
B = np.linalg.eigvals(A)#求特征值
if np.all(B>0):             #判断是不是所有的特征值都大于0,用到了all函数,显然对称阵A不是正定的
    print( 'Yes')
else:
    print('No')

参考资料:
1、Python–线性代数篇
2、透析矩阵,由浅入深娓娓道来—高数-线性代数-矩阵

posted @ 2018-10-11 10:06  hanzi5  阅读(1908)  评论(0编辑  收藏  举报