第15章 求矩阵特征值和特征向量
幂 法
幂法规范化算法
1. 输入矩阵A、初始向量u,误差eps 2. k?1
3. 计算V(k) ?Au(k-1)
4. mk ?max(V), mk-1 ?max(V) 5. uk ? V(k)/mk
(1)
6. 如果| mk - mk-1| 注:如上算法中的符号max(V)表示取向量V中绝对值最大的分量。本算法使用了数据规范化处理技术以防止计算过程中出现益出错误。 (k) (k-1) (0) 规范化幂法程序 Clear[a,u,x]; a=Input[\系数矩阵A=\; u=Input[\初始迭代向量u(0)=\; n= Length[u]; eps= Input[\误差精度eps =\; nmax=Input[“迭代允许最大次数nmax=”]; fmax[x_]:=Module[{m=0,m1,m2}, Do[m1=Abs[x[[k]]]; If[m1>m,m2=x[[k]];m=m1], {k,1,Length[x]}]; m2] v=a.u; m0=fmax[u]; m1=fmax[v]; t=Abs[m1-m0]//N; k=0; While[t>eps&&k v=a.u;k=k+1; m0=m1; m1=fmax[v]; t=Abs[m1-m0]//N; Print[\ 特征值=\ 误差=\ Print[\ 特征向量=\ ]; If[k>=nmax,Print[\迭代超限\ 说明:本程序用于求矩阵A按模最大的特征值及其相应特征向量。程序执行后,先通过键盘输入矩阵A、迭代初值向量u(0)、精度控制eps和迭代允许最大次数nmax,程序即可给出每次迭代的次数和对应的迭代特征值、特征向量及误差序列,它们都按10位有效数输出。其中最后输出的结果即为所求的特征值和特征向量序。如果迭代超出nmax次还没有求出满足精度的根则输出迭代超限提示,此时可以根据输出序列判别收敛情况。 程序中变量说明 a:存放矩阵A u:初始向量u和迭代过程中的向量u (k) (0) (k) 及所求特征向量 v: 存放迭代过程中的向量V m1: 存放所求特征值和迭代过程中的近似特征值 nmax:存放迭代允许的最大次数 eps:存放误差精度 fmax[x]: 给出向量x中绝对值最大的分量 k:记录迭代次数 t1:临时变量 注:迭代最大次数可以修改为其他数字。 例题与实验 例1. 用幂法求矩阵 ?133?A??44??88? 65?6135??46??90??的按模最大的特征值及其相应特征向量,要求误差<10-4。 解:执行幂法程序后在输入的4个窗口中按提示分别输入 {{133,6,135},{44,5,46},{-88,-6,-90}},{1,1,1},0.0001,20 每次输入后用鼠标点击窗口的“OK”按扭,得如下输出结果。 k=1 特征值=44.42335766 误差=229.5766423 特征向量={1., 0.3467153285, -0.6715328467} k=2 特征值=44.92343082 误差=0.5000731606 特征向量={1., 0.3341275058, -0.6672691423} k=3 特征值=44.99546459 误差=0.07203376236 特征向量={1., 0.3333729572, -0.6667020234} k=4 特征值=44.99977337 误差=0.004308781874 特征向量={1., 0.3333351894, -0.6666684279} k=5 特征值=44.99998937 误差=0.0002160020115 特征向量={1., 0.3333334179, -0.6666667492} k=6 特征值=44.99999952 误差=0.0000101441501 特征向量={1., 0.3333333371, -0.6666666704} 此结果说明迭代6次,求得误差为err=0.0000101441501的按模最大的特征值=44.99999952 及其对应的一个特征向量={1., 0.3333333371, -0.6666666704}。本题矩阵A的3个特征值为{45., 2., 1.},可见所求结果很好。但如果执行幂法程序后在输入的4个窗口中按提示分别输入 {{133,6,135},{44,5,46},{-88,-6,-90}},{1,1,-1},0.0001,20 每次输入后用鼠标点击窗口的“OK”按扭,得如下输出结果。 k=1 特征值=2.5 误差=1.5 特征向量={1., 0.75, -1.} k=2 特征值=2.2 误差=0.3 特征向量={1., 0.7, -1.} k=3 特征值=2.090909091 误差=0.1090909091 特征向量={1., 0.6818181818, -1.} k=4 特征值=2.043478261 误差=0.04743083004 特征向量={1., 0.6739130435, -1.} k=5 特征值=2.021276596 误差=0.02220166512 特征向量={1., 0.670212766, -1.} k=6 特征值=2.010526316 误差=0.01075027996 特征向量={1., 0.6684210526, -1.} k=7 特征值=2.005235602 误差=0.005290713695 特征向量={1., 0.667539267, -1.} k=8 特征值=2.002610966 误差=0.002624636037 特征向量={1., 0.6671018277, -1.} k=9 特征值=2.001303781 误差=0.001307185093 特征向量={1., 0.6668839635, -1.} k=10 特征值=2.000651466 误差=0.0006523151668 特征向量={1., 0.6667752443, -1.} k=11 特征值=2.000325627 误差=0.0003258389664 特征向量={1., 0.6667209378, -1.} k=12 特征值=2.000162787 误差=0.0001628399197 特征向量={1., 0.6666937978, -1.} k=13 特征值=2.000081387 误差=0.00008140008032 特征向量={1., 0.6666802311, -1.} 此结果说明迭代13次,求得误差为err=0.00008140008032的按模最大的特征值=2.000081387及其对应的一个特征向量={1., 0.6666802311, -1.}。 选用不同的迭代初值获得两个不同结果,显然第二个特征值=2.000081387不是模最大的特征值。 上面实验说明使用幂法依赖于迭代初值的选取且有时得到的结果不是模最大的特征值(知道是什么原因吗?)。不过一般情况下,幂法是可以求出按模最大的特征值的。如果不放心,可以选用两个不同的初值迭代计算,通过计算结果可以马上确定按模最大的特征值。 例2. 用幂法求矩阵 ?2?A??1?1??2133??1??1??的按模最大的特征值及其相应特征向量,要求误差< 10。 解:执行幂法程序后在输入的4个窗口中按提示分别输入 {{2.,-2.,3.}, {1,1.,1}, {1.,3,-1}},{1,0,1},0.00001,20 每次输入后用鼠标点击窗口的“OK”按扭,得如下输出结果。 ……………………………………………………. k=9 特征值=2.990381958 误差=0.04540393411 特征向量={1., 0.9810402963, 0.952738931} k=10 特征值=2.974823934 误差=0.01555802398 特征向量={0.9684837058, 0.9810717388, 1.} k=11 特征值=2.99573741 误差=0.02091347561 特征向量={1., 0.9915058875, 0.9787802529} k=12 特征值=2.988679144 误差=0.007058265982 特征向量={0.985843744, 0.9915041722, 1.} k=13 特征值=2.998102573 误差=0.009423429932 特征向量={1., 0.996208617, 0.9905232775} k=14 特征值=2.994943938 误差=0.003158635286 特征向量={0.993679344, 0.9962073749, 1.} k=15 特征值=2.999155514 误差=0.004211575789 特征向量={1., 0.9983114144, 0.9957787292} k=16 特征值=2.997748176 误差=0.001407337687 特征向量={0.9971851559, 0.9983110678, 1.} k=17 特征值=2.999624371 误差=0.001876194866 特征向量={1., 0.9992487853, 0.9981219847} k=18 特征值=2.998998284 误差=0.0006260875486 特征向量={0.9987478473, 0.9992487055, 1.} k=19 特征值=2.999832987 误差=0.0008347031267 特征向量={1., 0.9996659782, 0.9991649479} k=20 特征值=2.999554616 误差=0.0002783707007 特征向量={0.9994432692, 0.9996659612, 1.} 迭代超限 此结果说明迭代20次后还没有得到满足要求的解,但观察特征值序列发现其是收敛的,因此可以增大迭代次数以求得满足要求的解。本题将最大迭代次数设定为100后得出在迭代第30次时的满足要求的解为 k=30 特征值=2.999992274 误差=4.828768325 10-6 特征向量={0.9999903425, 0.9999942055, 1.} 注意到本题按模最大的特征值为3,因此求解效果较满意。 -5 反 幂 法 反幂法规范化算法 1. 输入矩阵A、初始向量u,误差eps 2. k?1 3. 解方程AV(k) =u(k-1) 求出解V(k) (k)(k-1) 4. mk ?max(V), mk-1 ?max(V) 5. uk ? V(k)/mk (1) 6. 如果| mk - mk-1| 注:如上算法中解方程AV(k) =u(k-1)可以使用Dololittle分解法。本算法使用了数据规范化处理技术以防止计算过程中出现益出错误。 (0) 规范化反幂法程序 Clear[a,u,x]; a=Input[\系数矩阵A=\; u=Input[\初始迭代向量u(0)=\; n= Length[u]; eps= Input[\误差精度eps =\; nmax=Input[“迭代允许最大次数nmax=”]; fmax[x_]:=Module[{m=0,m1,m2}, Do[m1=Abs[x[[k]]]; If[m1>m,m2=x[[k]];m=m1], {k,1,Length[x]}]; m2]; v=a.u; a1=Inverse[a]; m0=fmax[u]; m1=fmax[v]; t=Abs[m1-m0]//N; k=0; While[t>eps&&k v=a1.u; k=k+1; m0=m1; m1=fmax[v]; t=Abs[m1-m0]//N; t1=Abs[1/m1-1/m0]//N; Print[\ 特征值=\ 误差=\ Print[\ 特征向量=\ ]; If[k>=nmax,Print[\迭代超限\ 说明:本程序用于求矩阵A按模最小的特征值及其相应特征向量。程序执行后,先通过