线性代数(21)——特征值和特征向量(下)

numpy中求取特征值和特征向量

特征值和特征向量的求取不进行编程实现,因为整个求取过程中最重要的是求解 d e t ( A − λ I ) = 0 det(A-λI)=0 det(AλI)=0 对应的 n n n次方程,其中 n n n是矩阵 A A A的阶数。

import numpy as np
from np.linalg import eig	# eigen缩写


if __name__ == "__main__":
	A1 = np.array([[4, -2], [1, 1]])
	# eig方法两个返回值,分别是特征值和特征向量
	eigen_values, eigen_vectors = eig(A1)
	print(eigen_values)	# [3.0, 2.0]
	print(eigen_vectors)	# [[0.8944..., 0.7071...], [0.4472..., 0.7071...]]

	A2 = np.array([[0, 1], [1, 0]])
    e_values, e_vectors = eig(A2)
    print(e_values)    # [1.0, -1.0]    
    print(e_vectors)   # [[0.7071, -0.7071], [0.7071, 0.7071]]

	# 复数特征值
	A3 = np.array([[0, -1], [1, 0]])
    e_values, e_vectors = eig(A3)
    print(e_values)    # [0.0+1.0j, 0.0-1.0j]
    print(e_vectors)   # [[0.7071 + 0j, 0.7071 - 0j], [0 - 0.7071j, 0 + 0.7071j]]

	# 多重特征值
	A4 = np.array([[1, 0], [0, 1]])
    e_values, e_vectors = eig(A4)
    print(e_values)    # [1.0, 1.0]
    print(e_vectors)   # [[1, 0], [0, 1]]

	A5 = np.array([[3, 1], [0, 3]])
    e_values, e_vectors = eig(A5)
    print(e_values)    # [3.0, 3.0]
    # [1, 0]和[-1, 0]实际上是线性相关(共线)的,这种结果产生是因为numpy本身内部的算法
    print(e_vectors)   # [[1, -1], [0, 0]]    

矩阵的相似型(相似矩阵)

这一节是在为之后理解特征值和特征向量的具体用途进行铺垫。同时也是理解特征值和特征向量中“特征”一词在矩阵中具体的指代。

定义

如果矩阵 A A A B B B满足, A = P − 1 B P A = P^{-1}BP A=P1BP 则称矩阵 A A A B B B相似。

理解这一概念可以类比相似三角形,回顾相似三角形,指的是三个内角相同,而三边的长度没有具体要求的两个三角形(即形状一样,大小不一样)。两个矩阵的相似和相似三角形一样,都是从不同的视角观察相同的内容, A = P − 1 B P A=P^{-1}BP A=P1BP这个关系式中,

LAPACK是一种线性代数库,用于解决各种数值线性代数问题,包括矩阵特征值特征向量的求解。下面我们来介绍一下LAPACK库中求解矩阵特征值特征向量的函数。 1. DSYEV函数 DSYEV函数用于求解实对称矩阵的特征值特征向量。该函数的原型如下: ``` void dsyev(char jobz, char uplo, int n, double* a, int lda, double* w, double* work, int lwork, int* info); ``` 参数说明: - jobz:指定计算特征值还是特征向量,取值为'N'(只计算特征值)或'V'(同时计算特征值特征向量)。 - uplo:指定矩阵的上三角部分还是下三角部分存储在数组a中,取值为'U'(上三角部分)或'L'(下三角部分)。 - n:矩阵的维数。 - a:存储矩阵的一维数组。 - lda:指定a数组中每个列向量的存储长度(通常为n)。 - w:存储特征值的一维数组。 - work:工作空间数组。 - lwork:指定work数组的长度(通常为3n)。 - info:返回求解结果,取值为0表示成功,其他值表示出错。 2. ZGEEV函数 ZGEEV函数用于求解复矩阵的特征值特征向量。该函数的原型如下: ``` void zgeev(char jobvl, char jobvr, int n, std::complex<double>* a, int lda, std::complex<double>* w, std::complex<double>* vl, int ldvl, std::complex<double>* vr, int ldvr, std::complex<double>* work, int lwork, double* rwork, int* info); ``` 参数说明: - jobvl:指定是否计算左特征向量,取值为'N'(不计算)或'V'(计算)。 - jobvr:指定是否计算右特征向量,取值为'N'或'V'。 - n:矩阵的维数。 - a:存储矩阵的一维数组。 - lda:指定a数组中每个列向量的存储长度(通常为n)。 - w:存储特征值的一维数组。 - vl:存储左特征向量的一维数组。 - ldvl:指定vl数组中每个列向量的存储长度(通常为n)。 - vr:存储右特征向量的一维数组。 - ldvr:指定vr数组中每个列向量的存储长度(通常为n)。 - work:工作空间数组。 - lwork:指定work数组的长度(通常为2n)。 - rwork:实数数组,长度为2n(用于存储中间计算结果)。 - info:返回求解结果,取值为0表示成功,其他值表示出错。 以上就是LAPACK库中求解矩阵特征值特征向量的函数介绍。需要注意的是,在调用这些函数之前,需要先将矩阵按列存储方式存储在一维数组中,并传入一些参数,如矩阵的维数、存储方式等。具体的参数可以参考LAPACK库的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值