python行列式计算不使用numpy_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')

你可能感兴趣的:(python行列式计算不使用numpy_Python:使用Numpy解决线性代数问题)