-
2021-09-12 20:30:45
证明:
设 A A A为实对称矩阵
A = A ‾ = A ‾ T A=\overline{A}=\overline{A}^T A=A=AT
x ‾ T A x = x ‾ T λ x = λ x T x \overline{x}^T Ax=\overline{x}^T\lambda x=\lambda x^T x xTAx=xTλx=λxTx
x ‾ T A ‾ T x = ( A ‾ x ‾ ) T x = A x ‾ T x = λ x ‾ T x = λ ‾ x ‾ T x \overline{x}^T \overline{A}^T x=(\overline{A}\overline{x})^Tx=\overline{Ax}^Tx=\overline{\lambda x}^Tx=\overline{\lambda} \overline{x}^Tx xTATx=(Ax)Tx=AxTx=λxTx=λxTx
λ x T x = λ ‾ x ‾ T x ⇒ ( λ − λ ‾ ) x ‾ T x = 0 ⇒ λ = λ ‾ \lambda x^T x=\overline{\lambda} \overline{x}^Tx \Rightarrow (\lambda -\overline{\lambda})\overline{x}^Tx=0 \Rightarrow \lambda=\overline{\lambda} λxTx=λxTx⇒(λ−λ)xTx=0⇒λ=λ更多相关内容 -
2阶实对称矩阵特征值和特征向量的简单求解方法.docx
2020-02-13 22:37:292阶实对称矩阵特征值和特征向量的简单求解方法。因为2阶实对称矩阵的特殊性,可以直接使用初中的2阶方程 x = -b±sqrt(b*b -4*a*c) / 2*a进行求解。这个方法在求解平面点的hessian矩阵很有用处。 -
用于估计对称矩阵特征值的串行和并行(MPI).rar
2020-12-13 23:36:09基于MPI的估计对称矩阵特征值的串行和并行程序优化。用于课程报告参考和期末复习以及对MPI并行程序优化进行进一步学习。 -
对称矩阵特征值Rayleigh 商迭代法
2022-02-26 16:48:22【内容介绍】利用Rayleigh 商迭代法计算对称矩阵的特征值 -
Augmented Householder Eigenvalue Solver:计算非对称矩阵的一些特征值和特征向量。-matlab开发
2021-05-31 04:08:03AHBEIGS:将为标准特征值问题 A*x = lambda*x 或广义特征值问题 A*x = lambda*B*x 找到一些特征值和特征向量。 [V,D,FLAG] = AHBEIGS(A,OPTIONS) [V,D,FLAG] = AHBEIGS(A,B,OPTIONS) [V,D,FLAG] = AHBEIGS('Afunc... -
【矩阵论】对称矩阵特征值的性质与直积
2020-06-06 16:45:23以下就从实对称矩阵的角度出发,利用特征值的极小极大原理,从普通特征值问题Ax=λxAx=\lambda xAx=λx衍生到广义特征值问题Ax=λBxAx=\lambda BxAx=λBx逐步讨论其特征值的性质。 【广义特征值问题】设A=(aij)∈Rn...前言
在许多实际问题中,所产生的矩阵往往都是对称矩阵,比如我们耳熟能详的实对称矩阵也是重要的研究对象。以下就从实对称矩阵的角度出发,利用特征值的
极小极大原理
,从普通特征值问题 A x = λ x Ax=\lambda x Ax=λx衍生到广义特征值问题 A x = λ B x Ax=\lambda Bx Ax=λBx逐步讨论其特征值的性质。【广义特征值问题】设 A = ( a i j ) ∈ R n × n A=(a_{ij})\in \mathbb{R}^{n\times n} A=(aij)∈Rn×n是 n n n阶
实对称
矩阵, B = ( b i j ) ∈ R n × n B=(b_{ij})\in \mathbb{R}^{n\times n} B=(bij)∈Rn×n是 n n n阶实对称正定
矩阵,使下式 A x = λ B x \mathbf{Ax=\lambda Bx} Ax=λBx 有非零解向量 x ∈ R n x\in \mathbb{R}^{n} x∈Rn,则称 λ \lambda λ是矩阵 A A A相对于矩阵 B B B的特征值,且 x x x是属于 λ \lambda λ的特征向量。该问题常见于振动理论。我们可以发现
- 当
B
≠
I
B\not=I
B=I时,该问题是
广义特征值问题
- 当
B
=
I
B=I
B=I时,该问题是
普通特征值问题
思路:如何利用极小极大原理求第 k k k个特征值及奇异值?
利用极大极小原理,我们先确定 n n n阶实对称阵的最大最小特征值,然后逐步求第2大和第2小特征值进而归纳到求第 k k k大和第 k k k小特征值。
本文就对称矩阵特征值的极性与直积做以梳理,完整定理证明请参考西工大的《矩阵论》[1]。
文章目录
一、实对称矩阵的瑞利商与广义瑞利商性质
我们在讨论实对称矩阵的特征值时,往往会通过实对称阵的瑞利商来研究,因为瑞利商是由如下特征值问题推导出来的,它可以直接求出矩阵的特征值。
A x = λ x ⇒ x T A x = λ x T x ⇒ λ = x T A x x T x = R ( x ) Ax=\lambda x \Rightarrow x^TAx=\lambda x^Tx \Rightarrow \lambda=\frac{x^TAx}{x^Tx}=R(x) Ax=λx⇒xTAx=λxTx⇒λ=xTxxTAx=R(x)【瑞利商定义】设 A = ( a i j ) ∈ R n × n A=(a_{ij})\in \mathbb{R}^{n\times n} A=(aij)∈Rn×n是 n n n阶
实对称
矩阵, x ∈ R n x\in \mathbb{R}^{n} x∈Rn,则称下式为矩阵 A A A的瑞利商( Rayleigh \text{Rayleigh} Rayleigh商) R ( x ) = x T A x x T x ( x ≠ 0 ) \mathbf{R(x) = \frac{x^TAx}{x^Tx}} \quad (x\not=\mathbf{0}) R(x)=xTxxTAx(x=0)【广义瑞利商定义】设 A = ( a i j ) ∈ R n × n , B = ( b i j ) ∈ R n × n A=(a_{ij})\in \mathbb{R}^{n\times n},B=(b_{ij})\in \mathbb{R}^{n\times n} A=(aij)∈Rn×n,B=(bij)∈Rn×n均是 n n n阶
实对称
矩阵,且 B B B正定
, x ∈ R n x\in \mathbb{R}^{n} x∈Rn,则称下式为矩阵 A A A相对于矩阵 B B B的广义瑞利商
R ( x ) = x T A x x T B x ( x ≠ 0 ) \mathbf{R(x) = \frac{x^TAx}{x^TBx}} \quad (x\not=\mathbf{0}) R(x)=xTBxxTAx(x=0)- 【性质1】: R ( x ) R(x) R(x)是 x x x的连续函数
- 【性质2】:
R
(
x
)
R(x)
R(x)是
x
x
x的零次齐次函数(齐次性
R
(
k
x
)
=
R
(
x
)
R(kx)=R(x)
R(kx)=R(x))
事实上,对于任意实数 λ ≠ 0 \lambda \not=0 λ=0有下式分别满足齐次性和零次
R ( λ x ) = R ( x ) = λ 0 R ( x ) R(\lambda x)=R(x)=\lambda^0 R(x) R(λx)=R(x)=λ0R(x) - 【性质3】:当 x x x是由 x 0 ≠ 0 x_0\not=0 x0=0张成的空间时, R ( x ) R(x) R(x)是一常数
- 【性质4】: R ( x ) R(x) R(x)的最大最小值存在,且能够在单位球面 S = { x ∣ x ∈ R n , ∥ x ∥ 2 = 1 } S=\{x|x\in \mathbb{R}^n,\|x\|_2=1\} S={x∣x∈Rn,∥x∥2=1}上达到
- 【性质5】:非零向量
x
0
x_0
x0是
R
(
x
)
R(x)
R(x)的
驻点
⇔ x 0 \Leftrightarrow x_0 ⇔x0是 A x = λ B x Ax=\lambda Bx Ax=λBx的特征向量
,当 B = I B=I B=I时对应于瑞利商问题同理,通过矩阵求导可得
一般情况下,我们令实对称矩阵 A A A的特征值按从小到大顺序排列如下
λ 1 ≤ λ 2 ≤ . . . ≤ λ n \lambda_1 \le \lambda_2 \le... \le \lambda_n λ1≤λ2≤...≤λn
对应标准正交特征向量系为 p 1 , p 2 , . . . , p n p_1,p_2,...,p_n p1,p2,...,pn。【定理】设 A = ( a i j ) ∈ R n × n A=(a_{ij})\in \mathbb{R}^{n\times n} A=(aij)∈Rn×n是 n n n阶
实对称
矩阵,则有 min x ≠ 0 R ( x ) = λ 1 , max x ≠ 0 R ( x ) = λ n , λ 1 ≤ R ( x ) ≤ λ n \mathbf{\min_{x\not=\mathbf{0}} R(x) = \lambda_1,\quad \max_{x\not=\mathbf{0}} R(x) = \lambda_n ,\quad \lambda_1 \le R(x) \le \lambda_n} x=0minR(x)=λ1,x=0maxR(x)=λn,λ1≤R(x)≤λn【证明】任取 0 ≠ x ∈ R n \mathbf{0}\not=x \in \mathbb{R}^n 0=x∈Rn,则有
x = c 1 p 1 + c 2 p 2 + . . . + c n p n ( c 1 2 + c 2 2 + . . . + c n 2 ≠ 0 ) x=c_1p_1+c_2p_2+...+c_np_n \quad (c_1^2+c_2^2+...+c_n^2\not=0) x=c1p1+c2p2+...+cnpn(c12+c22+...+cn2=0)
由于 p 1 , p 2 , . . . , p n p_1,p_2,...,p_n p1,p2,...,pn是正交特征向量系,所以有 x i = c i p i x_i=c_ip_i xi=cipi
于是有
A x = λ x = λ 1 c 1 p 1 + λ 2 c 2 p 2 + . . . + λ n c n p n x T A x = c 1 2 λ 1 + c 2 2 λ 2 + . . . + c n 2 λ n x T x = c 1 2 + c 2 2 + . . . + c n 2 \begin{aligned} Ax&=\lambda x=\lambda_1c_1p_1+\lambda_2c_2p_2+...+\lambda_nc_np_n\\ x^TAx & =c_1^2\lambda_1+c_2^2\lambda_2+...+c_n^2\lambda_n \\ x^Tx & =c_1^2+c_2^2+...+c_n^2 \\ \end{aligned} AxxTAxxTx=λx=λ1c1p1+λ2c2p2+...+λncnpn=c12λ1+c22λ2+...+cn2λn=c12+c22+...+cn2
令 k i = c i 2 c 1 2 + c 2 2 + . . . + c n 2 k_i=\frac{c_i^2}{c_1^2+c_2^2+...+c_n^2} ki=c12+c22+...+cn2ci2,其中 k 1 + k 2 + . . . + k n = 1 k_1+k_2+...+k_n=1 k1+k2+...+kn=1,则有
R ( x ) = x T A x x T x = k 1 λ 1 + k 2 λ 2 + . . . + k n λ n R(x) =\frac{x^TAx}{x^Tx}=k_1\lambda_1+k_2\lambda_2+...+k_n\lambda_n R(x)=xTxxTAx=k1λ1+k2λ2+...+knλn
简单起见,假设 A A A是 2 2 2阶实对称阵,即仅有两个特征值 λ 1 , λ 2 \lambda_1,\lambda_2 λ1,λ2满足 R ( x ) = k 1 λ 1 + k 2 λ 2 ( k 1 + k 2 = 1 ) R(x)=k_1\lambda_1+k_2 \lambda_2\;(k_1+k_2=1) R(x)=k1λ1+k2λ2(k1+k2=1),则如下图所示从上图,我们可以清晰的看出 R ( x ) R(x) R(x)是 x x x的
连续函数
,该集合也被称为凸包
,由此可得
λ 1 ≤ R ( x ) ≤ λ n \lambda_1 \le R(x) \le \lambda_n λ1≤R(x)≤λn
可以通过如下式子验证 R ( p 1 ) = λ 1 R(p_1)=\lambda_1 R(p1)=λ1
R ( p i ) = p i T A p i p i T p i = λ i R(p_i) =\frac{p_i^TAp_i}{p_i^Tp_i}=\lambda_i R(pi)=piTpipiTApi=λi
有了 p k p_k pk或 x k x_k xk,我们可以直接求得第 k k k小特征值 λ k \lambda_k λk。但问题来了,如果我们不知道 p k p_k pk或者不想依赖于 x k x_k xk,我们如何求得第 k k k小特征值 λ k \lambda_k λk呢?这就需要下面一章的极小极大原理了。【重要推论】若 λ 1 = . . . = λ k ( 1 ≤ k ≤ n ) \lambda_1=...=\lambda_k(1\le k \le n) λ1=...=λk(1≤k≤n),则在 ∥ x ∥ 2 = 1 \|x\|_2=1 ∥x∥2=1上, R ( x ) R(x) R(x)的所有极小点为 l 1 p 1 + l 2 p 2 + . . . + l k p k \mathbf{l_1p_1+l_2p_2+...+l_kp_k} l1p1+l2p2+...+lkpk 其中, l i ∈ R ( i = 1 , . . . , k ) l_i\in R(i=1,...,k) li∈R(i=1,...,k),且满足 l 1 2 + l 1 2 + . . + l k 2 = 1 l_1^2+l_1^2+..+l_k^2=1 l12+l12+..+lk2=1.
二、普通与广义特征值的极小极大原理
由上章,我们得到几个工具,令 V n = span { x 1 , x 2 , . . . , x n } ( λ 1 ≤ λ 2 ≤ . . . ≤ λ n ) V_n=\text{span}\{x_1,x_2,...,x_n\}\;(\lambda_1 \le \lambda_2 \le... \le \lambda_n ) Vn=span{x1,x2,...,xn}(λ1≤λ2≤...≤λn)则有
R ( x ) = x T A x x T x = k 1 λ 1 + k 2 λ 2 + . . . + k n λ n R(x) =\frac{x^TAx}{x^Tx}=k_1\lambda_1+k_2\lambda_2+...+k_n\lambda_n R(x)=xTxxTAx=k1λ1+k2λ2+...+knλn
λ 1 ≤ R ( x ) ≤ λ n ⇒ { min x ≠ 0 , x ∈ V n R ( x ) = λ 1 max x ≠ 0 , x ∈ V n R ( x ) = λ n \lambda_1 \le R(x) \le \lambda_n \Rightarrow \begin{cases} \min_{x\not=\mathbf{0},x\in V_n} R(x) = \lambda_1 \\ \max_{x\not=\mathbf{0},x\in V_n} R(x) = \lambda_n \\ \end{cases} λ1≤R(x)≤λn⇒{minx=0,x∈VnR(x)=λ1maxx=0,x∈VnR(x)=λn
当我们想求 λ 2 , λ n − 1 \lambda_2,\lambda_{n-1} λ2,λn−1时,可以通过缩小张成的子空间得到
λ 2 = min x ≠ 0 R ( x ) = k 1 λ 1 + k 2 λ 2 + . . . + k n λ n s . t . k 1 = 0 ⋮ λ i = min x ≠ 0 R ( x ) = k 1 λ 1 + k 2 λ 2 + . . . + k n λ n s . t . k 1 = k 2 = . . . = k i − 1 = 0 \begin{aligned} \lambda_{2}= \min_{x\not=0} & \; R(x) =k_1\lambda_1+k_2\lambda_2+...+k_n\lambda_n\\ s.t. & \;\; k_{1}=0 \\ \end{aligned} \\ \vdots \\ \begin{aligned} \lambda_{i}= \min_{x\not=0} & \; R(x) =k_1\lambda_1+k_2\lambda_2+...+k_n\lambda_n\\ s.t. & \;\; k_1=k_2=...=k_{i-1}=0 \\ \end{aligned} \\ λ2=x=0mins.t.R(x)=k1λ1+k2λ2+...+knλnk1=0⋮λi=x=0mins.t.R(x)=k1λ1+k2λ2+...+knλnk1=k2=...=ki−1=0
同理得
λ n − 1 = max x ≠ 0 R ( x ) = k 1 λ 1 + k 2 λ 2 + . . . + k n λ n s . t . k n = 0 ⋮ λ n − i − 1 = min x ≠ 0 R ( x ) = k 1 λ 1 + k 2 λ 2 + . . . + k n λ n s . t . k n = k n − 1 = . . . = k n − i = 0 \begin{aligned} \lambda_{n-1}= \max_{x\not=0} & \; R(x) =k_1\lambda_1+k_2\lambda_2+...+k_n\lambda_n\\ s.t. & \;\; k_{n}=0 \\ \end{aligned} \\ \vdots \\ \begin{aligned} \lambda_{n-i-1}= \min_{x\not=0} & \; R(x) =k_1\lambda_1+k_2\lambda_2+...+k_n\lambda_n\\ s.t. & \;\; k_n=k_{n-1}=...=k_{n-i}=0 \\ \end{aligned} \\ λn−1=x=0maxs.t.R(x)=k1λ1+k2λ2+...+knλnkn=0⋮λn−i−1=x=0mins.t.R(x)=k1λ1+k2λ2+...+knλnkn=kn−1=...=kn−i=0
因此,我们可以归纳出如下定理【定理】设 x ∈ L ( p r , p r + 1 , . . . , p s ) , 1 ≤ r ≤ s ≤ n x\in L(p_r,p_{r+1},...,p_s),1 \le r \le s \le n x∈L(pr,pr+1,...,ps),1≤r≤s≤n,则有 min x ≠ 0 R ( x ) = λ r max x ≠ 0 R ( x ) = λ s \mathbf{\min_{x\not=0} \; R(x) =\lambda_r \quad \max_{x\not=0} \; R(x) =\lambda_s} x=0minR(x)=λrx=0maxR(x)=λs
2.1 引出问题:由于 V k V_k Vk不唯一导致得到多个特征值
但以上定理在 p r , p s p_r,p_{s} pr,ps未知下无法使用,因此我们不再指定让某个系数 k i = 0 k_i=0 ki=0,而是选取 k k k维子空间 V k V_k Vk来求,由于 V k V_k Vk是不唯一的,因此可能会得到多个特征值,例如我们想要得到 λ 2 \lambda_2 λ2,则选取 V n − 1 V_{n-1} Vn−1,有如下两种情况
min x ≠ 0 R ( x ) = { λ 1 if x 1 ∈ V n − 1 λ 2 if x 1 ∉ V n − 1 \min_{x\not=0}\; R(x)= \begin{cases} \lambda_{1} \quad \;\;\; \text{if} \;\; x_1 \in V_{n-1} \\ \lambda_{2} \quad \;\;\; \text{if} \;\; x_1 \notin V_{n-1} \\ \end{cases} x=0minR(x)={λ1ifx1∈Vn−1λ2ifx1∈/Vn−1
max x ≠ 0 R ( x ) = { λ n if x n ∈ V n − 1 λ n − 1 if x n ∉ V n − 1 \max_{x\not=0}\; R(x)= \begin{cases} \lambda_{n} \quad \;\;\; \text{if} \;\; x_n \in V_{n-1} \\ \lambda_{n-1} \quad \text{if} \;\; x_n \notin V_{n-1} \\ \end{cases} x=0maxR(x)={λnifxn∈Vn−1λn−1ifxn∈/Vn−12.2 解决问题:使用极大极小原理固定特征向量
对于上述子空间 V k V_k Vk不唯一情况,得到
min 0 ≠ x ∈ V n − 1 R ( x ) ≤ λ 2 max 0 ≠ x ∈ V n − 1 R ( x ) ≥ λ n − 1 \min_{0\not =x\in V_{n-1}} R(x)\le \lambda_{2} \quad \max_{0\not =x\in V_{n-1}}\ R(x)\ge \lambda_{n-1} 0=x∈Vn−1minR(x)≤λ20=x∈Vn−1max R(x)≥λn−1
为解决此问题,我们使用极小极大原理得到
λ 2 = max V n − 1 [ min 0 ≠ x ∈ V n − 1 R ( x ) ] , λ n − 1 = min V n − 1 [ max 0 ≠ x ∈ V n − 1 R ( x ) ] \lambda_{2} = \max_{V_{n-1}} \left[ \min_{0\not =x\in V_{n-1}} R(x) \right] ,\; \; \lambda_{n-1} = \min_{V_{n-1}} \left[ \max_{0\not =x\in V_{n-1}} R(x) \right] λ2=Vn−1max[0=x∈Vn−1minR(x)],λn−1=Vn−1min[0=x∈Vn−1maxR(x)]
为此,我们归纳出一般的式子,我们【定理】设 V k V_k Vk是 R n \mathbb{R}^n Rn中的任意一个 k k k维子空间,则
普通特征值
问题与广义特征值
问题从小到大
的第 k k k个特征值和 n − ( k − 1 ) n-(k-1) n−(k−1)个特征值具有如下极小极大性质
λ n − ( k − 1 ) = max V k [ min 0 ≠ x ∈ V k R ( x ) ] , λ k = min V k [ max 0 ≠ x ∈ V k R ( x ) ] \mathbf{\lambda_{n-(k-1)} = \max_{V_{k}} \left[ \min_{0\not =x\in V_{k}} R(x) \right] ,\; \; \lambda_{k} = \min_{V_{k}} \left[ \max_{0\not =x\in V_{k}} R(x) \right] } λn−(k−1)=Vkmax[0=x∈VkminR(x)],λk=Vkmin[0=x∈VkmaxR(x)]- 左式被称为特征值的
极大极小
原理 - 右式被称为特征值的
极小极大
原理
三、矩阵奇异值的极小极大性质
我们通过矩阵瑞利商的极小极大原理,可以衍生到解决奇异值问题,我们将矩阵 A ∈ R r m × n A\in \mathbb{R}_r^{m\times n} A∈Rrm×n的奇异值排列如下 [其中, σ i = λ i ( A T A ) \sigma _i = \sqrt{\lambda_i (A^TA)} σi=λi(ATA)]
0 = σ 1 = σ 2 = . . . = σ n − r ≤ σ n − r + 1 ≤ . . . ≤ σ n 0=\sigma _1 =\sigma _2 =... =\sigma _{n-r} \le \sigma _{n-r+1} \le ... \le \sigma _{n} 0=σ1=σ2=...=σn−r≤σn−r+1≤...≤σn我们令 B = A T A B=A^TA B=ATA,则实对称矩阵 B B B的瑞利商如下
R ( x ) = x T B x x T x = x T ( A T A ) x x T x = ( A x ) T A x x T x = ∥ A x ∥ 2 2 ∥ x ∥ 2 2 = λ = σ R(x) =\frac{x^TBx}{x^Tx} =\frac{x^T(A^TA)x}{x^Tx}=\frac{(Ax)^TAx}{x^Tx}=\frac{\|Ax\|_2^2}{\|x\|_2^2}=\lambda=\sqrt{\sigma} R(x)=xTxxTBx=xTxxT(ATA)x=xTx(Ax)TAx=∥x∥22∥Ax∥22=λ=σ
则矩阵 A A A的第 k k k个奇异值和第 n − k + 1 n-k+1 n−k+1个奇异值具有如下极小极大性质
σ n − ( k − 1 ) = max V k [ min 0 ≠ x ∈ V k ∥ A x ∥ 2 ∥ x ∥ 2 ] , σ k = min V k [ max 0 ≠ x ∈ V k ∥ A x ∥ 2 ∥ x ∥ 2 ] \sigma _{n-(k-1)} = \max_{V_{k}} \left[ \min_{0\not =x\in V_{k}}\frac{\|Ax\|_2}{\|x\|_2} \right] ,\; \; \sigma _{k} = \min_{V_{k}} \left[ \max_{0\not =x\in V_{k}}\frac{\|Ax\|_2}{\|x\|_2} \right] σn−(k−1)=Vkmax[0=x∈Vkmin∥x∥2∥Ax∥2],σk=Vkmin[0=x∈Vkmax∥x∥2∥Ax∥2]
其中, V k V_k Vk是 R n \mathbb{R}^n Rn中的任意一个 k k k维子空间。附录:矩阵直积( Kronecker \text{Kronecker} Kronecker积)的概念
运用矩阵的直积运算,能够将线性矩阵方程转换为线性代数方程组进行求解
【定义】设 A = ( a i j ) ∈ C m × n , B = ( b i j ) ∈ C p × q A=(a_{ij})\in \mathbb{C}^{m\times n},B=(b_{ij})\in \mathbb{C}^{p\times q} A=(aij)∈Cm×n,B=(bij)∈Cp×q,则称如下分块矩阵为 A A A与 B B B的直积( Kronecker \text{Kronecker} Kronecker积)
参考文献
程云鹏, 凯院, 仲. 矩阵论[M]. 西北工业大学出版社, 2006.
- 当
B
≠
I
B\not=I
B=I时,该问题是
-
practice_对称矩阵特征值和特征向量计算_
2021-09-28 20:20:47采用雅克比矩阵进行对称矩阵特征值和特征向量计算 -
实对称矩阵特征值特征向量求解算法C语言实现
2021-04-05 09:17:31雅可比方法用于求解实对称矩阵的特征值和特征向量,对于实对称矩阵AAA,必有正交矩阵UUU,使得UTAU=DU^{T}AU=DUTAU=D.DDD是一个对角阵,主对角线的元素是矩阵AAA的特征值,正交矩阵UUU的每一列对应于属于矩阵DDD的主对角...一 算法原理
雅可比方法用于求解实对称矩阵的特征值和特征向量,对于实对称矩阵 A A A,必有正交矩阵 U U U,使得 U T A U = D U^{T}AU=D UTAU=D. D D D是一个对角阵,主对角线的元素是矩阵 A A A的特征值,正交矩阵 U U U的每一列对应于属于矩阵 D D D的主对角线对应元素的特征向量.
雅可比方法用平面旋转对矩阵 A A A做相似变换,化 A A A为对角阵,从而求解出特征值和特征向量.旋转矩阵 U p q U_p{_q} Upq,是一个单位阵在第 p p p行,第 p p p列,第 q q q行,第 q q q列,元素为 c o s φ cos\varphi cosφ,第 p p p行第 q q q列为 − s i n φ -sin\varphi −sinφ,第 q q q行第 p p p列为 s i n φ sin\varphi sinφ.对于这样的平面旋转矩阵,不难验证其是一种正交矩阵.因此对于向量 x x x, U p q x U_p{_q}x Upqx等同于把第 p p p个坐标轴和第 q q q个坐标轴共同所确定的平面旋转了 φ \varphi φ度.记矩阵 A 1 = U p q T A U p q A_1=U_p{_q}^{T}AU_p{_q} A1=UpqTAUpq.因为旋转矩阵是正交阵,因此实际上矩阵 A 1 A_1 A1与矩阵 A A A是相似的,因此其特征值是相同的.
设矩阵 A 1 A_1 A1第 i i i行,第 j j j列的元素为 b i j b_i{_j} bij,矩阵 A A A的第 i i i行,第 j j j列的元素为 a i j a_i{_j} aij( i = 0 , 1 , 2 , . . . , n − 1 , j = 0 , 1 , 2 , . . . , n − 1 i=0,1,2,...,n-1,j=0,1,2,...,n-1 i=0,1,2,...,n−1,j=0,1,2,...,n−1).式(1-1-1)给出了两矩阵元素之间的运算关系.
{ b p p = a p p c o s 2 φ + a q q s i n 2 φ + 2 a p q c o s φ s i n φ b q q = a p p s i n 2 φ + a q q c o s 2 φ − 2 a p q c o s φ s i n φ b p q = b q p = 1 2 ( a q q − a p p ) s i n 2 φ + a p q c o s 2 φ b p i = a p i c o s φ + a q i s i n φ , ( i ≠ p , q ) b q i = − a p i s i n φ + a q i c o s φ , ( i ≠ p , q ) b j p = a j p c o s φ + a j q s i n φ , ( j ≠ p , q ) b j q = − a j q s i n φ + a j q c o s φ , ( j ≠ p , q ) b i j = b j i = a i j , i ≠ p , q ; j ≠ p , q (1-1-1) \begin{cases} b_p{_p}=a_p{_p}cos^2\varphi+a_q{_q}sin^2\varphi+2a_p{_q}cos\varphi{sin\varphi}\\ b_q{_q}=a_p{_p}sin^2\varphi+a_q{_q}cos^2\varphi-2a_p{_q}cos\varphi{sin\varphi}\\ b_p{_q}=b_q{_p}=\frac{1}2(a_q{_q}-a_p{_p})sin2\varphi+a_p{_q}cos2\varphi\\ b_p{_i}=a_p{_i}cos\varphi+a_q{_i}sin\varphi,(i\ne{p},q)\\ b_q{_i}=-a_p{_i}sin\varphi+a_q{_i}cos\varphi,(i\ne{p},q)\\ b_j{_p}=a_j{_p}cos\varphi+a_j{_q}sin\varphi,(j\ne{p},q)\\ b_j{_q}=-a_j{_q}sin\varphi+a_j{_q}cos\varphi,(j\ne{p},q)\\ b_i{_j}=b_j{_i}=a_i{_j},i{\ne}p,q;j{\ne}p,q \end{cases} \tag{1-1-1} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧bpp=appcos2φ+aqqsin2φ+2apqcosφsinφbqq=appsin2φ+aqqcos2φ−2apqcosφsinφbpq=bqp=21(aqq−app)sin2φ+apqcos2φbpi=apicosφ+aqisinφ,(i=p,q)bqi=−apisinφ+aqicosφ,(i=p,q)bjp=ajpcosφ+ajqsinφ,(j=p,q)bjq=−ajqsinφ+ajqcosφ,(j=p,q)bij=bji=aij,i=p,q;j=p,q(1-1-1)
其中有两点需要说明:(1) p p p, q q q分别是前一次的迭代矩阵的非主对角线上绝对值最大元素的行列号
(2) φ \varphi φ是旋转角度,可以由式(1-1-2)确定
t a n 2 φ = − 2 a p q a q q − a p p (1-1-2) tan2\varphi=\frac{-2a_p{_q}}{a_q{_q}-a_p{_p}} \tag{1-1-2} tan2φ=aqq−app−2apq(1-1-2)
归纳得到雅可比方法求解矩阵特征值和特征向量的具体步骤如下:
(1).初始化特征向量为对角阵V,主对角线元素为1,其他元素为0.
(2).在 A A A的非主对角线的元素中,找到绝对值最大元素 a p q a_p{_q} apq.
(3).用式(1-1-2)计算出旋转矩阵
(4).计算矩阵 A 1 A1 A1,用当前的矩阵 V V V乘旋转矩阵得到当前的特征矩阵 V V V.
(5).若当前迭代的矩阵 A A A的非主对角线元素最大值小于给定阈值,停止计算,否则执行上述过程.停止计算时,特征值为矩阵 A A A的主对角线元素,特征矩阵为矩阵 V V V.
二 C语言实现
#include<stdio.h> #include<stdlib.h> float** Matrix_Jac_Eig(float **array, int n, float *eig); int Matrix_Free(float **tmp, int m, int n); int main(void) { int n; printf("请输入矩阵维度:\n"); scanf("%d", &n); float **array = (float **)malloc(n * sizeof(float *)); if (array == NULL) { printf("error :申请数组内存空间失败\n"); return -1; } for (int i = 0; i < n; i++) { array[i] = (float *)malloc(n * sizeof(float)); if (array[i] == NULL) { printf("error :申请数组子内存空间失败\n"); return -1; } } printf("请输入矩阵元素:\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%f", &array[i][j]); } } float *eig = (float *)malloc(n * sizeof(float)); float **Result = Matrix_Jac_Eig(array, n, eig); printf("特征矩阵元素:\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%f ", Result[i][j]); } printf("\n"); } printf("特征矩阵元素:\n"); for (int i = 0; i < n; i++) { printf("%f \n", eig[i]); } Matrix_Free(Result, n, n); free(eig); eig = NULL; return 0; } float** Matrix_Jac_Eig(float **array, int n, float *eig) { //先copy一份array在temp_mat中,因为我实在堆区申请的空间,在对其进行处理 //的过程中会修改原矩阵的值,因此要存储起来,到最后函数返回的 //时候再重新赋值 int i, j, flag, k; flag = 0; k = 0; float sum = 0; float **temp_mat = (float **)malloc(n * sizeof(float *)); for (i = 0; i < n; i++) { temp_mat[i] = (float *)malloc(n * sizeof(float)); } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { temp_mat[i][j] = array[i][j]; } } //判断是否为对称矩阵 for (i = 0; i < n; i++) { for (j = i; j < n; j++) { if (array[i][j] != array[j][i]) { flag = 1; break; } } } if (flag == 1) { printf("error in Matrix_Eig: 输入并非是对称矩阵:\n"); return NULL; } else { //开始执行算法 int p, q; float thresh = 0.0000000001; float max = array[0][1]; float tan_angle, sin_angle, cos_angle; float **result = (float **)malloc(n * sizeof(float *)); if (result == NULL) { printf("error in Matrix_Eig:申请空间失败\n"); return NULL; } float **result_temp = (float **)malloc(n * sizeof(float *)); if (result_temp == NULL) { printf("error in Matrix_Eig:申请空间失败\n"); return NULL; } float **rot = (float **)malloc(n * sizeof(float *)); if (rot == NULL) { printf("error in Matrix_Eig:申请空间失败\n"); return NULL; } float **mat = (float **)malloc(n * sizeof(float *)); if (mat == NULL) { printf("error in Matrix_Eig:申请空间失败\n"); return NULL; } for (i = 0; i < n; i++) { result[i] = (float *)malloc(n * sizeof(float)); if (result[i] == NULL) { printf("error in Matrix_Eig:申请子空间失败\n"); return NULL; } result_temp[i] = (float *)malloc(n * sizeof(float)); if (result_temp[i] == NULL) { printf("error in Matrix_Eig:申请子空间失败\n"); return NULL; } rot[i] = (float *)malloc(n * sizeof(float)); if (rot[i] == NULL) { printf("error in Matrix_Eig:申请子空间失败\n"); return NULL; } mat[i] = (float *)malloc(n * sizeof(float)); if (mat[i] == NULL) { printf("error in Matrix_Eig:申请子空间失败\n"); return NULL; } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (i == j) { result[i][j] = 1; } else { result[i][j] = 0; } } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (i == j) { mat[i][j] = 1; } else { mat[i][j] = 0; } } } max = array[0][1]; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (i == j) { continue; } else { if (fabs(array[i][j]) >= fabs(max)) { max = array[i][j]; p = i; q = j; } else { continue; } } } } while (fabs(max) > thresh) { if (fabs(max) < thresh) { break; } tan_angle = -2 * array[p][q] / (array[q][q] - array[p][p]); sin_angle = sin(0.5*atan(tan_angle)); cos_angle = cos(0.5*atan(tan_angle)); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (i == j) { mat[i][j] = 1; } else { mat[i][j] = 0; } } } mat[p][p] = cos_angle; mat[q][q] = cos_angle; mat[q][p] = sin_angle; mat[p][q] = -sin_angle; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { rot[i][j] = array[i][j]; } } for (j = 0; j < n; j++) { rot[p][j] = cos_angle*array[p][j] + sin_angle*array[q][j]; rot[q][j] = -sin_angle*array[p][j] + cos_angle*array[q][j]; rot[j][p] = cos_angle*array[j][p] + sin_angle*array[j][q]; rot[j][q] = -sin_angle*array[j][p] + cos_angle*array[j][q]; } rot[p][p] = array[p][p] * cos_angle*cos_angle + array[q][q] * sin_angle*sin_angle + 2 * array[p][q] * cos_angle*sin_angle; rot[q][q] = array[q][q] * cos_angle*cos_angle + array[p][p] * sin_angle*sin_angle - 2 * array[p][q] * cos_angle*sin_angle; rot[p][q] = 0.5*(array[q][q] - array[p][p]) * 2 * sin_angle*cos_angle + array[p][q] * (2 * cos_angle*cos_angle - 1); rot[q][p] = 0.5*(array[q][q] - array[p][p]) * 2 * sin_angle*cos_angle + array[p][q] * (2 * cos_angle*cos_angle - 1); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { array[i][j] = rot[i][j]; } } max = array[0][1]; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (i == j) { continue; } else { if (fabs(array[i][j]) >= fabs(max)) { max = array[i][j]; p = i; q = j; } else { continue; } } } } for (i = 0; i < n; i++) { eig[i] = array[i][i]; } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { sum = 0; for (k = 0; k < n; k++) { sum = sum + result[i][k] * mat[k][j]; } result_temp[i][j] = sum; } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { result[i][j] = result_temp[i][j]; } } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { array[i][j] = temp_mat[i][j]; } } Matrix_Free(result_temp, n, n); Matrix_Free(rot, n, n); Matrix_Free(mat, n, n); Matrix_Free(temp_mat, n, n); return result; } } int Matrix_Free(float **tmp, int m, int n) { int i, j; if (tmp == NULL) { return(1); } for (i = 0; i < m; i++) { if (tmp[i] != NULL) { free(tmp[i]); tmp[i] = NULL; } } if (tmp != NULL) { free(tmp); tmp = NULL; } return(0); }
三 结果
-
海量3×3实对称矩阵的快速特征值计算:对于多个3x3实对称矩阵,向量化矩阵运算,支持GPU计算-matlab开发
2021-05-30 14:21:32计算许多3x3实对称矩阵的特征值。 计算是非迭代的,基于完全矢量化的 matlab 矩阵运算,并且支持 GPU 计算。 它可以快速有效地同时处理多个 3×3 矩阵。 此代码特别适合 3D 中的张量/黎曼微积分、体积张量图像的可视... -
实对称矩阵特征值和特征向量PPT学习教案.pptx
2021-10-02 18:53:46实对称矩阵特征值和特征向量PPT学习教案.pptx -
2阶实对称矩阵特征值和特征向量的简单求解方法
2020-02-13 22:29:07定理:2阶实对称矩阵H的特征值是实数 H=[a,b;b,c] a,b,c是实数,λ 是特征值 A=[a-λ,b;b,c-λ] 特征值求解方法为:(a- λ )(c- λ) - b2 = 0 求解方程得到两个根为:λ=(a+c)±(a+c)2-4(ac-b2)2 ...- 2阶实对称矩阵特性
定理:2阶实对称矩阵H的特征值是实数
H=[a,b;b,c]
a,b,c是实数,λ 是特征值
A=[a-λ,b;b,c-λ]特征值求解方法为:(a- λ
)(c- λ)
- b2
= 0
求解方程得到两个根为:
λ=(a+c)±(a+c)2-4(ac-b2)2(a+c)2-4ac-b2=a-c2+4b2≥0
所以,在a、b、c为实数时,特征值也是实数。
2、特征向量
根据特征值和特征向量的定义:HX=λX,(H-λE)X = 0;因此方程若有解,则
det(H-λE)=0;
设
A=[a-λ,b;b,c-λ]则有-b/(a-λ) = (c-λ)/b, 线性齐次方程组AX=0有非零解,其中之一解向量 [1,-b/(a-λ)],归一化后得到标准解。
-
基于CORDIC算法的高精度浮点对称矩阵特征值分解的FPGA实现.pdf
2021-07-13 13:56:25基于CORDIC算法的高精度浮点对称矩阵特征值分解的FPGA实现.pdf -
基于神经网络方法的对称矩阵特征值的求解.pdf
2021-09-25 15:54:37基于神经网络方法的对称矩阵特征值的求解.pdf -
Lanczos 法 和 QR分解 求解实对称矩阵特征值
2018-12-04 22:29:52Lanczos法的目的:将实对称矩阵转换成为三对角矩阵(稀疏矩阵),从而便于计算机储存和后续的计算。 在三对角矩阵矩阵上,采用QR分解,得到矩阵的特征值。 # -*- coding: utf-8 -*- """ Created ... -
实对称矩阵的特征值求法_矩阵论系列——特征值篇
2020-11-20 15:49:52特征值篇1——特征值和特征向量特征值篇1--特征值和特征向量_thompson的博客-CSDN博客blog.csdn.net特征值篇2——特征子空间特征值篇2--特征子空间_thompson的博客-CSDN博客blog.csdn.net特征值篇3——矩阵可... -
实对称矩阵的特征值求法_梳理:矩阵对角化
2020-10-21 22:12:472.矩阵A的所有特征值的积等于A的行列式。3.关于A的矩阵多项式f(A)的特征值为f(μ)。4.若A可逆,则A−1的特征值为1/μ。5.若A与B相似,则A与B有相同特征多项式,即A与B特征值相同。6.属于A的不同特征值的特征向量线性... -
实对称矩阵的特征值求法_对称矩阵、对角矩阵与三角矩阵
2020-10-19 21:21:42对称矩阵对称矩阵(Symmetric Matrix)是指元素以主对角线为对称轴对应相等的矩阵,例如: 可以看到,对称矩阵的转置等于其自身,即: 对角矩阵对角矩阵(Diagonal Matrix)是指除主对角线之外其他元素都为0的矩阵,... -
【线性代数】详解正定矩阵、实对称矩阵、矩阵特征值分解、矩阵 SVD 分解
2020-09-11 00:29:22本文主要针对线性代数中的正定矩阵、实对称矩阵、矩阵特征值分解以及矩阵 SVD 分解进行总结。 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应... -
实对称矩阵的特征值求法_机器学习与线性代数 - 特殊矩阵
2020-10-21 22:12:45它们的特征向量可能具有特定的特征值或特殊关系。还有一些方法可以将一个矩阵分解成这些“更简单”的矩阵。操作复杂性的降低提高了可伸缩性。然而,即使这些矩阵都是特殊的,它们也不是罕见的。在机器学习和许多应用... -
实对称矩阵的特征值求法_【8】实(反)对称矩阵的特征值
2020-11-20 15:49:53先上一道题,来自xqh博客每周一题设 为 阶实反对称矩阵, 为 阶实对称矩阵,证明: 均为非奇异阵(亦即: )这道题有两种考虑方式一是考虑证明直接矩阵满秩,二是转化为求解特征值(即 证明 不是 的特征值)下面按两... -
如何用C语言编写求对称矩阵的特征值和特征向量的程序编写对称矩阵的特征值和特征向量,其中矩阵用二维数组...
2021-05-20 00:47:03优质解答//数值计算程序-特征值和特征向量////////////////////////////////////////////////////////////////约化对称矩阵为三对角对称矩阵//利用Householder变换将n阶实对称矩阵约化为对称三对角矩阵//a-长度为n*n... -
实对称矩阵的特征值求法_机器学习和线性代数 - 特征值和特征向量
2020-10-21 22:12:45从机器学习、量子计算、物理到许多数学和工程的问题,都可以通过找到一个矩阵的特征值和特征向量来解决。根据定义(标量λ、向量v是特征值、特征向量A):视觉上,Av与特征向量v位于同一直线上。这里有些例子。然而,Ax... -
对称特征值分解和 SVD:对称矩阵的特征分解或任意矩阵的奇异值分解-matlab开发
2021-05-30 17:23:12此提交包含用于通过基于频谱分而治之的高效稳定算法计算对称矩阵 (QDWHEIG.M) 的特征值分解和奇异值分解 (QDWHSVD.M) 的函数。 计算结果往往比 MATLAB 的内置函数 EIG.M 和 SVD.M 给出的结果更准确。 函数 TEST.M ... -
矩阵的特征值与特征向量的计算的matlab实现,幂法、反幂法和位移反幂法、雅可比(Jacobi)方法、豪斯霍尔德...
2018-12-11 21:34:09矩阵的特征值与特征向量的计算的matlab实现,幂法、反幂法和位移反幂法、雅可比(Jacobi)方法、豪斯霍尔德(Householder)方法、实对称矩阵的三对角化、QR方法、求根位移QR方法计算实对称矩阵 的特征值、广义特征值问题... -
numpy使用linalg.eig计算实对称矩阵特征值和特征向量时为什么会出现复数?
2018-03-15 02:39:48我通过外部文件导入建立了一个无向图的邻接矩阵,是一个实对称矩阵,矩阵规模较大,然后计算特征值和特征向量的时候,为什么特征值和特征向量里面会出现复数?该怎样处理?谢谢了! -
实对称矩阵的特征值求法_“绝境之下”,如何求解矩阵的特征值?
2020-11-20 15:49:53特征多项式求解一个矩阵的特征值应该是大家所要掌握的基本功,但是,相信很多同学发现,很多答案的解析,...“抵消法”:考研范围内的矩阵求特征值,普遍是三阶矩阵,针对三阶实对称矩阵,一般是使用“抵消为0”先凑... -
实对称矩阵的特征值求法_特征值的最大值与最小值
2020-11-20 15:49:53本文研究实对称矩阵特征值的最大值与最小值。定理设 是 阶实对称矩阵,记 分别是 中所有特征值中的最大值与最小值,则 证明:这里只证关于最大值的那部分。最小值的证明是完全类似的。因为 是实对称矩阵,所以 有由 ... -
eigND - n 维特征值:实数非对称 N 维矩阵的特征值-matlab开发
2021-06-01 19:01:23eigND.c 实数非对称 N 维矩阵的特征值E=eigND(A); 计算 N 维“方”矩阵 A 的特征值。 如果 A 的大小为 [nxnxpxqxrx ...],则 E 是来自 A 的前两个维度的每个 [nxn] 方阵。 E 是大小 [nx 1 xpxqxrx ...] 请注意,E 的... -
实对称矩阵的特征值求法_正交矩阵学习小结
2020-11-20 15:49:52从正交矩阵开始正交矩阵 定义1 称n阶方阵A是正交矩阵,若 正交矩阵有几个重要性质: A的逆等于A的转置,即 A的行列式为±1,即 A的行(列)向量组为n维单位正交向量组上述3个性质可以看做是正交矩阵的判定准则,我们... -
实对称矩阵的特征值求法_实对称矩阵、相似、标准型、合同的逻辑网
2020-11-20 15:49:53考虑充要条件==, 矩阵A、B相似==A、B特征值相同且A、B均可相似标准化(特征对角阵化)——1 矩阵A、B合同==A、B有相同正负惯性指数——2 矩阵A、B均以正交变换进行相似对角化,即A、B均与各自相似标准型合同==A、B与...