张瑞
中国科学技术大学数学科学学院
rui@ustc.edu.cn |
若有数及维非零向量满足
则称是矩阵的特征值,称为特征向量。
矩阵的特征值是经常需要计算的量: 如迭代矩阵是否收敛矩阵取决于它的谱半径, Google搜索中,使用特征值来决定网页的相关性。
这里,需要矩阵有个线性无关的特征向量, , , , 即是完备的。
以一个非0向量开始,构造序列
显然序列有通项公式。下面,看一下序列的表现。
设初值可以表达为
则有通项
由均为特征向量,因而
因而
不防假定
则有
(1) 若
此时,, 。 因而,随着的不断增大,不断接近0。
当充分大后,
因而,有
也就是说,近似为的特征向量,且与共线。
因而,对的任意分量
依特征向量的定义,此时和均为的特征向量。
(2) 若,且
当充分大后,
从而
可以看到,与共线,且对的任意分量
另外,由
得到
依特征向量的性质,相应的特征向量可以取为
(3) 特征值的其它分布情况,如: ,请参考相关书籍, 这里不再考虑
幂法的算法为:
for i in range(maxsteps):
x2=np.dot(mat,x1)
with np.errstate(divide='ignore'): # 去掉除0的警告
x21=x2/x1 # x^{(k+1)}/x^{(k)}
x20=x2/x0 # x^{(k+1)}/x^{(k-1)}
steps.append((i+2,[x2,x21,x20]))
y0=[]
for y00 in x21:
if np.isnan(y00): continue
y0.append(y00)
if np.array(y0).ptp()<eps: #计算最大值与最小值差
result=[1,np.array(y0).max(),[x2]]
break
y0=[]
for y00 in x20:
if np.isnan(y00): continue
y0.append(y00)
if np.array(y0).ptp()<eps:
result=[2,np.sqrt(np.array(y0).max()),[x1,x2]]
break;
x0=x1
x1=x2
例 1. 求解矩阵
的按模最大特征值和相应的特征向量
解. 若干步计算后,得到的计算结果
After 64 steps
---- Step: 61
[4.65661287e+20 9.31322575e+20 2.53997066e+20]
跟前1步的比值 [inf 2. 1.5]
跟前2步的比值 [5. 5. 5.]
---- Step: 62
[0.00000000e+00 2.32830644e+21 8.46656886e+20]
跟前1步的比值 [0. 2.5 3.33333333]
跟前2步的比值 [nan 5. 5.]
---- Step: 63
[2.32830644e+21 4.65661287e+21 1.26998533e+21]
跟前1步的比值 [inf 2. 1.5]
跟前2步的比值 [5. 5. 5.]
---- Step: 64
[0.00000000e+00 1.16415322e+22 4.23328443e+21]
跟前1步的比值 [0. 2.5 3.33333333]
跟前2步的比值 [nan 5. 5.]
---- Step: 65
[1.16415322e+22 2.32830644e+22 6.34992665e+21]
跟前1步的比值 [inf 2. 1.5]
跟前2步的比值 [5. 5. 5.]
根据数据,可以判断特征值分布为?特征向量是?
按模最大有互为反号的2个
2.23606797749979
特征向量:
[array([1.16415322e+22, 2.32830644e+22, 6.34992665e+21]),
array([0.00000000e+00, 5.82076609e+22, 2.11664222e+22])]
的计算结果
After 125 steps
---- Step: 123
[ 2.87805266e+120 -3.45499252e+119 -5.18248878e+119]
跟前1步的比值 [-9.66025404 -9.66025404 -9.66025404]
跟前2步的比值 [93.32050808 93.32050808 93.32050808]
---- Step: 124
[-2.78027198e+121 3.33761055e+120 5.00641582e+120]
跟前1步的比值 [-9.66025404 -9.66025404 -9.66025404]
跟前2步的比值 [93.32050808 93.32050808 93.32050808]
---- Step: 125
[ 2.68581336e+122 -3.22421658e+121 -4.83632486e+121]
跟前1步的比值 [-9.66025404 -9.66025404 -9.66025404]
跟前2步的比值 [93.32050808 93.32050808 93.32050808]
---- Step: 126
[-2.59456394e+123 3.11467512e+122 4.67201268e+122]
跟前1步的比值 [-9.66025404 -9.66025404 -9.66025404]
跟前2步的比值 [93.32050808 93.32050808 93.32050808]
根据数据,可以判断特征值分布为?特征向量是?
按模最大只有一个
-9.660254037755953
特征向量:
[array([ 2.50641467e+124, -3.00885529e+123, -4.51328293e+123])]
由
可以看到,
幂法在计算中,很可能造成计算的溢出(上溢出到,或下溢出归0)。
规范的幂法运算就是在每一步计算中添加一个规范化的操作
给定初值后,取, 代入上式构造序列。
得到的序列满足,它永远不会溢出。
依算法,有
由,因而可以写成
不防设
则
(1) 若
则充分大以后,有
从而
此时,就是特征向量。利用它可以得到特征值。
注意到
因而
的符号由序列的表现决定。
(2) 若, 且
则充分大以后,有
从而
因此,
此时,需要借助幂法的操作来得到特征值和特征向量。
不防记
则做2步幂法,
类似与幂法时的分析,可以得到
此时与是共线的,取任意分量计算可以得到
及
规范幂法的算法:
例 2. 用规范的幂法求解矩阵
的按模最大特征值和相应的特征向量
解. 若干步计算后,得到的计算结果
After 58 steps
---- Step: 55
[array([0.5 , 1. , 0.27272727])]
---- Step: 56
[array([0. , 1. , 0.36363636])]
---- Step: 57
[array([0.5 , 1. , 0.27272727])]
---- Step: 58
[array([0. , 1. , 0.36363636])]
---- Step: 59
[array([0.5 , 1. , 0.27272727])]
根据数据,可以判断特征值分布为?特征向量是?
按模最大有互为反号的2个
2.23606797749979
特征向量:
[array([1. , 2. , 0.54545455]),
array([0. , 5. , 1.81818182])]
与幂法的结果比较
按模最大有互为反号的2个
2.23606797749979
特征向量:
[array([1.16415322e+22, 2.32830644e+22, 6.34992665e+21]),
array([0.00000000e+00, 5.82076609e+22, 2.11664222e+22])]
的计算结果
Regular Power method:
---- Step: 99
[array([ 1. , -0.12004619, -0.18006928])]
---- Step: 100
[array([-1. , 0.12004619, 0.18006928])]
---- Step: 101
[array([ 1. , -0.12004619, -0.18006928])]
---- Step: 102
[array([-1. , 0.12004619, 0.18006928])]
---- Step: 103
[array([ 1. , -0.12004619, -0.18006928])]
根据数据,可以判断特征值分布为?特征向量是?
按模最大只有一个且<0
-9.66025403842121
特征向量:
[-1. 0.12004619 0.18006928]
与幂法的结果相比
按模最大只有一个
-9.660254037755953
特征向量:
[array([ 2.50641467e+124, -3.00885529e+123, -4.51328293e+123])]
的计算结果
Regular Power method:
---- Step: 40
[array([1. , 0.4174243 , 0.79128785])]
---- Step: 41
[array([1. , 0.4174243 , 0.79128785])]
---- Step: 42
[array([1. , 0.4174243 , 0.79128785])]
---- Step: 43
[array([1. , 0.4174243 , 0.79128785])]
---- Step: 44
[array([1. , 0.4174243 , 0.79128785])]
根据数据,可以判断特征值分布为?特征向量是?
按模最大只有一个且>0
11.791287847526174
特征向量:
[1. 0.4174243 0.79128785]
与幂法的结果相比
按模最大只有一个
11.79128784753576
特征向量:
[array([2.75104171e+55, 1.14835167e+55, 2.17686587e+55])]
例 3. 求矩阵
的按模最大特征值和相应的特征向量
解. 用Python的 numpy.linalg.eig
得到的
特征值: [0.35066373 0.19933627 0.34 ]
用幂法的计算结果
幂法
到达步数上限
---- Step: 497
[6.73673188e-226 4.47136945e-226 1.39643836e-233]
跟前1步的比值 [0.35066373 0.35066373 0.34 ]
跟前2步的比值 [0.12296505 0.12296505 0.1156 ]
---- Step: 498
[2.36232754e-226 1.56794710e-226 4.74789042e-234]
跟前1步的比值 [0.35066373 0.35066373 0.34 ]
跟前2步的比值 [0.12296505 0.12296505 0.1156 ]
---- Step: 499
[8.28382592e-227 5.49822179e-227 1.61428274e-234]
跟前1步的比值 [0.35066373 0.35066373 0.34 ]
跟前2步的比值 [0.12296505 0.12296505 0.1156 ]
---- Step: 500
[2.90483731e-227 1.92802697e-227 5.48856133e-235]
跟前1步的比值 [0.35066373 0.35066373 0.34 ]
跟前2步的比值 [0.12296505 0.12296505 0.1156 ]
规范的幂法
Regular Power method:
---- Step: 553
[array([1.00000000e+00, 6.63729754e-01, 3.67709048e-09])]
---- Step: 554
[array([1.00000000e+00, 6.63729754e-01, 3.56526968e-09])]
---- Step: 555
[array([1.00000000e+00, 6.63729754e-01, 3.45684936e-09])]
---- Step: 556
[array([1.00000000e+00, 6.63729754e-01, 3.35172612e-09])]
---- Step: 557
[array([1.00000000e+00, 6.63729754e-01, 3.24979968e-09])]
按模最大只有一个且>0
0.35066373006863033
特征向量:
[1.00000000e+00 6.63729754e-01 3.15097285e-09]
由
可以看到,规范幂法的收敛速度由或的大小决定, 它越接近0,收敛越快。
前面算例中的数值实验结果也可以看到这点。
特征值 | 收敛步数 | |
---|---|---|
([ 1.5 , 2.23606798, -2.23606798]) | 0.67 | 58 |
([11.79128785, 5. , 7.20871215]) | 0.62 | 43 |
([-9.66025404, 7.66025404, 7. ]) | 0.79 | 102 |
([0.19933627 , 0.34 , 0.35066373]) | 0.97 | 556 |
可以使用原点位移法来加速幂法的收敛。
注意到矩阵的特征值与矩阵的特征值相差,即。 因而,可以选取合适的,使得
这样,对矩阵的幂法的收敛速度会比矩阵的幂法快。
例 4. 求矩阵
的按模最大特征值和相应的特征向量
解. 可以看到的特征值与的相差,它们的收敛步数为
(array([0.19933627 , 0.34 , 0.35066373]), 步数: 556, 比值: 0.97)
(array([-0.00066373, 0.14 , 0.15066373]), 步数: 245, 比值: 0.93)
问题. 若初值
中, 会对计算结果产生怎样的影响?
反幂法用来求解矩阵的按模最小的特征值和相应的特征向量。
若矩阵可逆,的分别是的特征值和相应的特征向量,则
即,与的特征值互为倒数。
这样,通过求的按模最大特征值就可以得到的按模最小特征值。
迭代序列
就是规范的幂法运算求解的按模最大特征值的序列。
通常用解线性方程组来避免求解矩阵的逆,
这里,一般用LU分解法来解方程组。
若的特征值为, 则反幂法的收敛速度由
的大小来决定。
可以看到,越接近0,收敛速度越快。
例 5. 求矩阵
的按模最大特征值和相应的特征向量
解. 可以看到的特征值与的相差,它们的收敛步数为
(特征值([0.19933627 , 0.34 , 0.35066373]), 步数: 45)
(特征值([-0.00066373, 0.14 , 0.15066373]), 步数: 5)
矩阵的运行结果
特征值: [0.35066373 0.19933627 0.34 ]
特征向量:
[[ 0.83317794 -0.00663715 -0.84807616]
[ 0.55300499 0.99997797 -0.52217004]
[ 0. 0. 0.09002932]]
[12.50144587 -0.61337544 11.10749297]
After 45 steps
按模最小只有一个且>0
0.1993362702596363
特征向量:
[ 6.63729738e-03 -1.00000000e+00 2.05746046e-11]
矩阵的运行结果,
特征值: [ 0.15066373 -0.00066373 0.14 ]
特征向量:
[[ 0.83317794 -0.00663715 -0.84807616]
[ 0.55300499 0.99997797 -0.52217004]
[ 0. 0. 0.09002932]]
[12.50144587 -0.61337544 11.10749297]
After 5 steps
按模最小只有一个且<0
-0.0006637297521077966
特征向量:
[-6.63729752e-03 1.00000000e+00 8.77659247e-17]
将反幂法用到矩阵上,
例 6. 求矩阵
的按模最大特征值和相应的特征向量
解. 可以看到,的特征值与前面的的特征值相差,,它们的收敛步数为
(特征值([ 0.05066373 -0.10066373 0.04 ]), 步数: 81)
(特征值([ 0.02066373 -0.13066373 0.01 ]), 步数: 27)
矩阵的运行结果
特征值: [ 0.05066373 -0.10066373 0.04 ]
特征向量:
[[ 0.83317794 -0.00663715 -0.84807616]
[ 0.55300499 0.99997797 -0.52217004]
[ 0. 0. 0.09002932]]
[12.50144587 -0.61337544 11.10749297]
=================================
Inverse Power method:
After 81 steps
按模最小只有一个且>0
0.039999999964299746
特征向量:
[-1. -0.61571125 0.10615711]
矩阵的运行结果,
特征值: [ 0.02066373 -0.13066373 0.01 ]
特征向量:
[[ 0.83317794 -0.00663715 -0.84807616]
[ 0.55300499 0.99997797 -0.52217004]
[ 0. 0. 0.09002932]]
[12.50144587 -0.61337544 11.10749297]
=================================
Inverse Power method:
After 27 steps
按模最小只有一个且>0
0.009999999991478744
特征向量:
[-1. -0.61571125 0.10615711]
例 7.
7.