线性代数Python计算:矩阵对角化
线性变换TTT的矩阵A∈Pn×n\boldsymbol{A}\in P^{n\times n}A∈Pn×n的对角化,即寻求对角阵Λ\boldsymbol{\Lambda}Λ,使得A\boldsymbol{A}A~Λ\boldsymbol{\Lambda}Λ,需分几步走:
(1)解方程det(λI−A)=0\det(\lambda\boldsymbol{I}-\boldsymbol{A})=0det(λI−A)=0,得根
λ1,λ2,⋯,λk∈P\lambda_1,\lambda_2,\cdots,\lambda_k\in Pλ1,λ2,⋯,λk∈P
为A\boldsymbol{A}A的特征值;
(2)对每一个特征值λi\lambda_iλi,解齐次线性方程组(λiI−A)x=o(\lambda_i\boldsymbol{I}-\boldsymbol{A})\boldsymbol{x}=\boldsymbol{o}(λiI−A)x=o,得基础解系αi1,αi2,⋯,αini\boldsymbol{\alpha}_{i1},\boldsymbol{\alpha}_{i2},\cdots,\boldsymbol{\alpha}_{in_i}αi1,αi2,⋯,αini,i=1,2,⋯,ki=1,2,\cdots,ki=1,2,⋯,k;
(3)若n1+n2+⋯+nk=nn_1+n_2+\cdots+n_k=nn1+n2+⋯+nk=n,则
Λ=diag(λ1,⋯,λ1⏟n1,⋯,λk,⋯,λk⏟nk)\boldsymbol{\Lambda}=\text{diag}(\underbrace{\lambda_1,\cdots,\lambda_1}_{n_1},\cdots,\underbrace{\lambda_k,\cdots,\lambda_k}_{n_k})Λ=diag(n1λ1,⋯,λ1,⋯,nkλk,⋯,λk)
A\boldsymbol{A}A~Λ\boldsymbol{\Lambda}Λ。即TTT在基α11,⋯,α1n1,⋯,αk1,⋯,αkn1\boldsymbol{\alpha}_{11},\cdots,\boldsymbol{\alpha}_{1n_1},\cdots,\boldsymbol{\alpha}_{k1},\cdots,\boldsymbol{\alpha}_{kn_1}α11,⋯,α1n1,⋯,αk1,⋯,αkn1下的矩阵为Λ\boldsymbol{\Lambda}Λ。
numpy.linalg提供了函数eigvals用来计算方阵的特征值,其调用接口为
eigvals(A)\text{eigvals(A)}eigvals(A)
参数A表示方阵A\boldsymbol{A}A。返回值为A\boldsymbol{A}A的nnn个根(包括重根)。需要提起注意的是,此处返回的根有可能是复数。对函数eigvals算出A\boldsymbol{A}A的每个ℝ中的特征值λ\lambdaλ,调用博文《线性方程组的通解》中定义的mySolve函数,计算(λI−A)x=o(\lambda\boldsymbol{I}-\boldsymbol{A})\boldsymbol{x}=\boldsymbol{o}(λI−A)x=o的基础解系,记为属于λ\lambdaλ的线性无关的特征向量。把属于各不同特征值的特征向量按序排列,若这些向量的总数恰为nnn,则构成向量空间的一个基底,且各特征值(包括重复值)构成的对角阵就是TTT在这个基下的矩阵。
例1 用Python计算矩阵A=(122212221)∈\boldsymbol{A}=\begin{pmatrix}1&2&2\\2&1&2\\2&2&1\end{pmatrix}\inA=⎝⎛122212221⎠⎞∈ℝ3×3^{3\times3}3×3的对角化。
import numpy as np #导入numpy
from fractions import Fraction as F #导入Fraction
np.set_printoptions(formatter= #设置输出数据格式{'all':lambda x:str(F(x).limit_denominator())})
A=np.array([[1,2,2], #设置矩阵[2,1,2],[2,2,1]],dtype='float')
n,_=A.shape #A的阶数
w=np.linalg.eigvals(A) #A的特征值
Lambda=np.diag(np.sort(w)) #对角阵
v=np.unique(np.round(w,decimals=10)) #特征值唯一化
I=np.eye(n) #单位阵
o=np.zeros((n,1)) #零向量
lam=v[0] #第1个特征值
P=(mySolve(lam*I-A,o))[:,1:] #属于第1个特征值的特征向量
for lam in v[1:]: #其余个特征值X=mySolve(lam*I-A,o) #属于特征值的特征向量P=np.hstack((P,X[:,1:n]))
print('对角阵:')
print(Lambda)
print('基:')
print(P)
程序的第5~7行设置矩阵A\boldsymbol{A}A的数据为A。第8行读取A\boldsymbol{A}A的阶数为n。第9行调用numpy.linalg的eigvals函数计算A\boldsymbol{A}A的nnn个特征值存于w。第10行调用numpy的diag函数用w按升序排列的nnn个值构造对角阵Lambda。第11行调用numpy的unique函数将w中的nnn个特征值删掉重复,仅保留不同值。即det(λI−A)=0\det(\lambda\boldsymbol{I}-\boldsymbol{A})=0det(λI−A)=0的所有重根仅算一个。得到的各不相同的特征值按升序存于v。注意,w中存储的A\boldsymbol{A}A的特征值都是浮点型的,为能确定重根,需限制精度。np.round(w,decimals=10)调用numpy的round函数将w中的值限制有效位数为10。第12行设置nnn阶单位阵I,第13行设置nnn-维零向量o。第14行读取第1个特征值λ1\lambda_1λ1为lam,第15行调用mySolve函数(见程序3.6中定义,第2行导入)解齐次线性方程组(λ1I−A)=o(\lambda_1\boldsymbol{I}-\boldsymbol{A})=\boldsymbol{o}(λ1I−A)=o,将所得基础解系(存于返回值的第2列起的各列)置于P中。第16~18行的for循环将其余各特征值所属特征向量依次置于P后,最终得到对角化后的基底。运行程序,输出
对角阵:
[[-1 0 0][ 0 -1 0][ 0 0 5]]
基:
[[-1 -1 1][ 1 0 1][ 0 1 1]]
即A=(122212221)∈\boldsymbol{A}=\begin{pmatrix}1&2&2\\2&1&2\\2&2&1\end{pmatrix}\inA=⎝⎛122212221⎠⎞∈ℝ3×3^{3\times3}3×3在基α1=(−110),α2=(−101)\boldsymbol{\alpha}_1=\begin{pmatrix}-1\\1\\0\end{pmatrix},\boldsymbol{\alpha}_2=\begin{pmatrix}-1\\0\\1\end{pmatrix}α1=⎝⎛−110⎠⎞,α2=⎝⎛−101⎠⎞和α3=(111)\boldsymbol{\alpha}_3=\begin{pmatrix}1\\1\\1\end{pmatrix}α3=⎝⎛111⎠⎞下对角化为Λ=(−1000−10005)\boldsymbol{\Lambda}=\begin{pmatrix}-1&0&0\\0&-1&0\\0&0&5\end{pmatrix}Λ=⎝⎛−1000−10005⎠⎞。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
线性代数Python计算:矩阵对角化相关推荐
- 【Python】如何用 python 计算矩阵相乘 - numpy.dot()
文章目录 一.如何用 python 计算矩阵乘法? 二.实例 参考链接 一.如何用 python 计算矩阵乘法? 使用 Numpy 包里的 dot() 函数. 该函数主要功能有两个:向量点积 和 矩阵 ...
- 线性代数Python计算导引
线性代数是深度学习的数学基础之一,理论完备,方法经典.Python是当下AI系统首选开发工具,易学好用.教学中攒下两者结合的多个课题,覆盖大学理工科<线性代数>课程内容,写成博文以飨读者. ...
- 线性代数Python计算:向量空间坐标变换
向量空间中两组基AAA和BBB之间相互线性表示构成的矩阵为过渡阵.若两组基中之一为自然基,譬如AAA为自然基,则基BBB的各向量在自然基下的坐标即构成基AAA到基BBB的过渡阵P\boldsymbol ...
- python计算矩阵对角线之和_Python练习题 028:求3*3矩阵对角线数字之和
[Python练习题 028] 求一个3*3矩阵对角线元素之和 ----------------------------------------------------- 这题解倒是解出来了,但总觉得 ...
- 线性代数Python计算:向量组的最大无关组计算
对给定的mmm-维向量组 α1=(a11a21⋮am1),α2=(a12a22⋮am2),⋯,αn=(a1na2n⋮amn)\boldsymbol{\alpha}_1=\begin{pmatrix}a ...
- 线性代数Python计算:线性变换的值域与核
设数域PPP上的向量空间PnP^nPn的线性变换TTT,在某个基下其变换矩阵A=(α1,α2,⋯,αn)\boldsymbol{A}=(\boldsymbol{\alpha}_1,\boldsymbo ...
- 线性代数Python计算:向量的模及向量间的夹角
numpy的dot函数计算两个向量α\boldsymbol{\alpha}α和β\boldsymbol{\beta}β的内积: dot(a,b)\text{dot(a,b)}dot(a,b) 两个参数 ...
- 线性代数Python计算:消元法与矩阵初等变换
对线性方程组 {a11x1+a12x2+⋯+a1nxn=b1a21x1+a22x2+⋯+a2nxn=b2⋯⋯⋯am1x1+am2x2+⋯+amnxn=bn\begin{cases}a_{11}x_1+ ...
- python计算矩阵行列式_基础 | Python 下的行列式值
关键词:线性代数 / 矩阵 / 行列式 矩阵作为绝大多数算法的算子,当矩阵里的数字被赋予了意义,例如每个 row 表示了一个线性方程式,那么如果把这些线性方程用向量的形式在 xyz 空间坐标中表示,从 ...
- 漫步线性代数二十七——矩阵对角化
现在我们开始实质性的计算,它非常简单并且在随后的几篇文章里都会用到.特征向量对角化一个矩阵: 3.假设n×nn\times n矩阵有nn个线性无关的特征向量,如果这些向量是矩阵SS的列,那么S−1AS ...
最新文章
- PEAR, PECL和Perl的区别
- 解决Win8.1键盘输入后鼠标左键响应延迟的问题
- 用python计算邮费-python习题1-最大的不可支付邮资问题
- 安装和配置Tomcat
- 阅读《Oracle内核技术揭秘》的读书笔记
- VTK:八叉树可视化用法实战
- Python20行代码实现视频字符化
- excel如何返回双引号
- 大android 平板,15.6英寸安卓大平板? 阿芙罗S1评测
- 什么视频会议系统好?
- 跳出公式,看清全局,图神经网络(GCN)原理详解
- 什么是IEC球压测试?
- 苹果cms小主题模板
- android 超链接事件,Android之捕获TextView超链接
- MOOC 中国大学 python爬取股票信息
- 交换机vlan配置实训心得_交换机与VLAN的配置实验报告.doc
- R语言survival包的survfit函数拟合生存曲线数据、survminer包的ggsurvplot函数可视化生存曲线、size参数指定曲线粗细、palette参数自定义生存曲线的颜色
- 什么是SPU和SKU
- [ctfshow]web入门——文件上传(web156-web163)
- 0基础快速入门Python,小白必看
热门文章
- [CityHunter]点击ListView项目后修改其内容
- 机器学习学习整理(二)对数几率回归与支持向量机
- This scheduler instance is still active but was recovered by another instanc解决办法
- HTML空格符号 nbsp; ensp; emsp; 介绍以及实现中文对齐的方法
- 把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩
- 图片加载防闪动的CSS方法
- PHP、TP5生成下载word
- Office2010打开多个excel文件时,开多个excel而不是同一个切换
- VM ware下载教程
- 自动升级Notes客户机AUT功能实战