线性代数Python计算:矩阵对角化

这篇具有很好参考价值的文章主要介绍了线性代数Python计算:矩阵对角化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线性代数Python计算:矩阵对角化
线性变换 T T T的矩阵 A ∈ P n × n \boldsymbol{A}\in P^{n\times n} APn×n的对角化,即寻求对角阵 Λ \boldsymbol{\Lambda} Λ,使得 A \boldsymbol{A} A~ Λ \boldsymbol{\Lambda} Λ,需分几步走:
(1)解方程 det ⁡ ( λ I − A ) = 0 \det(\lambda\boldsymbol{I}-\boldsymbol{A})=0 det(λIA)=0,得根
λ 1 , λ 2 , ⋯   , λ k ∈ P \lambda_1,\lambda_2,\cdots,\lambda_k\in P λ1,λ2,,λkP
A \boldsymbol{A} A的特征值;
(2)对每一个特征值 λ i \lambda_i λi,解齐次线性方程组 ( λ i I − A ) x = o (\lambda_i\boldsymbol{I}-\boldsymbol{A})\boldsymbol{x}=\boldsymbol{o} (λiIA)x=o,得基础解系 α i 1 , α i 2 , ⋯   , α i n i \boldsymbol{\alpha}_{i1},\boldsymbol{\alpha}_{i2},\cdots,\boldsymbol{\alpha}_{in_i} αi1,αi2,,αini i = 1 , 2 , ⋯   , k i=1,2,\cdots,k i=1,2,,k
(3)若 n 1 + n 2 + ⋯ + n k = n n_1+n_2+\cdots+n_k=n n1+n2++nk=n,则
Λ = diag ( λ 1 , ⋯   , λ 1 ⏟ n 1 , ⋯   , λ k , ⋯   , λ k ⏟ n k ) \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} Λ。即 T T T在基 α 11 , ⋯   , α 1 n 1 , ⋯   , α k 1 , ⋯   , α k n 1 \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 n n n个根(包括重根)。需要提起注意的是,此处返回的根有可能是复数。对函数eigvals算出 A \boldsymbol{A} A的每个ℝ中的特征值 λ \lambda λ,调用博文《线性方程组的通解》中定义的mySolve函数,计算 ( λ I − A ) x = o (\lambda\boldsymbol{I}-\boldsymbol{A})\boldsymbol{x}=\boldsymbol{o} (λIA)x=o的基础解系,记为属于 λ \lambda λ的线性无关的特征向量。把属于各不同特征值的特征向量按序排列,若这些向量的总数恰为 n n n,则构成向量空间的一个基底,且各特征值(包括重复值)构成的对角阵就是 T T T在这个基下的矩阵。
例1 用Python计算矩阵 A = ( 1 2 2 2 1 2 2 2 1 ) ∈ \boldsymbol{A}=\begin{pmatrix}1&2&2\\2&1&2\\2&2&1\end{pmatrix}\in A= 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=14))    			#特征值唯一化
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 n n n个特征值存于w。第10行调用numpy的diag函数用w按升序排列的 n n n个值构造对角阵Lambda。第11行调用numpy的unique函数将w中的 n n n个特征值删掉重复,仅保留不同值。即 det ⁡ ( λ I − A ) = 0 \det(\lambda\boldsymbol{I}-\boldsymbol{A})=0 det(λIA)=0的所有重根仅算一个。得到的各不相同的特征值按升序存于v。注意,w中存储的 A \boldsymbol{A} A的特征值都是浮点型的,为能确定重根,需限制精度。np.round(w,decimals=14)调用numpy的round函数将w中的值限制有效位数为14。第12行设置 n n n阶单位阵I,第13行设置 n n n-维零向量o。第14行读取第1个特征值 λ 1 \lambda_1 λ1为lam,第15行调用mySolve函数(见博文《线性方程组的通解》)解齐次线性方程组 ( λ 1 I − A ) = o (\lambda_1\boldsymbol{I}-\boldsymbol{A})=\boldsymbol{o} (λ1IA)=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 = ( 1 2 2 2 1 2 2 2 1 ) ∈ \boldsymbol{A}=\begin{pmatrix}1&2&2\\2&1&2\\2&2&1\end{pmatrix}\in A= 122212221 3 × 3 ^{3\times3} 3×3在基 α 1 = ( − 1 1 0 ) , α 2 = ( − 1 0 1 ) \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 = ( 1 1 1 ) \boldsymbol{\alpha}_3=\begin{pmatrix}1\\1\\1\end{pmatrix} α3= 111 下对角化为 Λ = ( − 1 0 0 0 − 1 0 0 0 5 ) \boldsymbol{\Lambda}=\begin{pmatrix}-1&0&0\\0&-1&0\\0&0&5\end{pmatrix} Λ= 100010005
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!文章来源地址https://www.toymoban.com/news/detail-480999.html

到了这里,关于线性代数Python计算:矩阵对角化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数|证明:矩阵特征值之和等于主对角线元素之和

    性质 1 设 n n n 阶矩阵 A = ( a i j ) boldsymbol{A} = (a_{ij}) A = ( a ij ​ ) 的特征值为 λ 1 , λ 2 , ⋯   , λ n lambda_1,lambda_2,cdots,lambda_n λ 1 ​ , λ 2 ​ , ⋯ , λ n ​ ,则 λ 1 + λ 2 + ⋯ + λ n = a 11 + a 22 + ⋯ + a n n lambda_1 + lambda_2 + cdots + lambda_n = a_{11} + a_{22} + cdots + a_{nn} λ 1 ​ + λ 2 ​

    2024年02月08日
    浏览(48)
  • 线性代数的学习和整理23:用EXCEL和python 计算向量/矩阵的:内积/点积,外积/叉积

      目录 1 乘法 1.1 标量乘法(中小学乘法) 1.1.1 乘法的定义 1.1.2 乘法符合的规律 1.2 向量乘法 1.2.1 向量:有方向和大小的对象 1.2.2 向量的标量乘法 1.2.3 常见的向量乘法及结果 1.2.4 向量的其他乘法及结果 1.2.5 向量的模长(长度) 模长的计算公式 1.2.6 距离 2 向量的各种乘法 2

    2024年01月23日
    浏览(51)
  • 线性代数(六):相似对角化

    定义6.1:对 n n n 阶方阵 A bold{A} A , B bold{B} B ,若有可逆 n n n 阶方阵 P bold{P} P 使得: P − 1 A P = B bold{P^{-1}AP=B} P − 1 AP = B 则称 A A A 与 B B B 相似,记作 A ∼ B bold{Asim B} A ∼ B ,而 P bold{P} P 称作相似变换矩阵。 Remark : 矩阵的相似关系是一种矩阵等价的关系。 定理6.1 :若

    2024年02月03日
    浏览(55)
  • Python处理矩阵和线性代数问题

    如未作说明,下列方法均调用自 linalg 矩阵分解 cholesky , qr ,奇异值分解 svd 求特征值 eigvals ,共轭对称阵特征值 eigvalsh(a[, UPLO]) 特征值和 特征向量 eig ,共轭对称的特征值和向量 eigh(a[, UPLO]) 特征数字 范数 norm ,迹 trace 条件数 cond ,行列式 det ,符号 slogdet 通过SVD方法求秩

    2024年02月05日
    浏览(37)
  • 线性代数的学习和整理1:用EXCEL进行基础的矩阵计算

    目录 1 写在最开始的话 EXCEL里计算线性代数的起点 心得 内容 2 EXCEL里矩形的加法 2.1  矩阵加法的性质 3 EXCEL里矩阵的减法 4 矩阵标量乘法/ 也称 数乘 4.1 矩阵的标量乘法的性质 5 矩阵点乘, 得到:点积/内积 ,使用mmult() 5.1 矩阵点乘规则 5.2  矩阵的乘法不符合交换性,不能交

    2024年03月20日
    浏览(53)
  • 【动手学深度学习】课程笔记 05-07 线性代数、矩阵计算和自动求导

    向量相关 矩阵相关 简单来说,范数是用来衡量矩阵(张量)大小的值,范数的值有不同的规定。 仅记录一些我比较陌生的知识。 张量的克隆 张量的降维 首先定义一个张量x,指定其元素的数据类型为32位的float: 接着调用求和函数,因为会对张量中的一些维度进行求和,求

    2024年02月03日
    浏览(47)
  • 线性代数 --- 计算斐波那契数列第n项的快速算法(矩阵的n次幂)

    The n-th term of Fibonacci Numbers:         斐波那契数列的是一个古老而又经典的数学数列,距今已经有800多年了。关于斐波那契数列的计算方法不难,只是当我们希望快速求出其数列中的第100,乃至第1000项时,有没有又准又快的方法,一直是一个值得探讨和研究的问题。笔者

    2024年04月27日
    浏览(46)
  • 线性代数Python计算:线性方程组的最小二乘解

    给定ℝ上无解线性方程组 A x = b boldsymbol{Ax}=boldsymbol{b} Ax = b ,构造 A T A boldsymbol{A}^text{T}boldsymbol{A} A T A 及 A T b boldsymbol{A}^text{T}boldsymbol{b} A T b ,然后调用博文《线性方程组的通解》定义的mySolve函数,解方程组 A T A x = A T b boldsymbol{A}^text{T}boldsymbol{Ax}=boldsymbol{A}^text{T

    2023年04月08日
    浏览(59)
  • 线性代数Python计算:二次型的标准形计算

    为寻求正交变换 y = P T x boldsymbol{y}=boldsymbol{P}^text{T}boldsymbol{x} y = P T x ,使得二次型 f = x T A x f=boldsymbol{x}^text{T}boldsymbol{Ax} f = x T Ax 的标准形为 f = y T Λ y f=boldsymbol{y}^text{T}boldsymbol{Lambda y} f = y T Λ y ,其中 Λ boldsymbol{Lambda} Λ 为一对角阵,只需要调用numpy.linalg的eigh函数

    2023年04月20日
    浏览(82)
  • 【数值计算方法(黄明游)】解线性代数方程组的迭代法(一):向量、矩阵范数与谱半径【理论到程序】

       注意:速读可直接跳转至“4、知识点总结”及“5、计算例题”部分   当涉及到线性代数和矩阵理论时, 向量、矩阵范数以及谱半径 是非常重要的概念,下面将详细介绍这些内容: a. 定义及性质   考虑一个 n n n 维向量 x x x ,定义一个实值函数 N ( x ) N(x) N ( x ) ,

    2024年01月25日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包