求矩阵特征值算法及程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
求矩阵特征值算法及程序简介
1.幂法
1、幂法规范化算法
(1)输入矩阵A 、初始向量)
0(μ,误差eps ;
(2)1⇐k ; (3)计算)1()
(-⇐k k A V
μ;
(4))max (,)
max ()1(1)
(--⇐⇐k k k k V m V m ;
(5)k k k m V /)()
(⇐μ
;
(6)如果eps m m k k <--1,则显示特征值1λ和对应的特征向量)1(x )
,终止;
(7)1+⇐k k ,转(3)
注:如上算法中的符号)max(V 表示取向量V 中绝对值最大的分量。本算法使用了数据规范化处理技术以防止计算过程中出现益出错误。
2、规范化幂法程序 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 m0=m1; m1=fmax[v]; t=Abs[m1-m0]//N; Print["k=",k," 特征值=",N[m1,10]," 误差=",N[t,10]]; Print[" 特征向量=",N[u,10]]]; If[k ≥nmax,Print["迭代超限"]] 说明:本程序用于求矩阵A 按模最大的特征值及其相应特征向量。程序执行后,先通过键盘输入矩阵A 、迭代初值向量)0(μ、精度控制eps 和迭代允许最大次数max n ,程序即可给出每次迭代的次数和对应的迭代特征值、特征向量及误差序列,它们都按10位有效数输出。其中最后输出的结果即为所求的特征值和特征向量序列。如果迭代超出max n 次还没有求出满足精度的根则输出迭代超限提示,此时可以根据输出序列判别收敛情况。 程序中变量说明 a:存放矩阵A ; u:初始向量)0(μ和迭代过程中的向量)(k μ及所求特征向量; v:存放迭代过程中的向量)(k V ; m1:存放所求特征值和迭代过程中的近似特征值; nmax:存放迭代允许的最大次数; eps:存放误差精度; fmax[x]: 给出向量x 中绝对值最大的分量; k:记录迭代次数; t1:临时变量; 注:迭代最大次数可以修改为其他数字。 3、例题与实验 例1. 用幂法求矩阵⎪⎪⎪ ⎭ ⎫ ⎝⎛---=9068846544 1356133A 的按模最大的特征值及其相应特征向量,要求误差410- 解:执行幂法程序后在输入的四个窗口中按提示分别输入: {{133,6,135},{44,5,46},{-88,-6,-90}}、{1,1,1}、0.0001、20 每次输入后用鼠标点击窗口的“OK ”按扭,得如下输出结果: 此结果说明迭代6次,求得误差为0.0000101442的按模最大的特征值为44.99999952,及其对应的一个特征向量:{1.000000000,0.3333333371,-0.6666666704} 2.反幂法 1、 反幂法规范化算法 (1)输入矩阵A 、初始向量) 0(μ,误差eps ; (2)1⇐k ; (3)计算)1() (-⇐k k AV μ求出解)(k V ; (4))max (,) max ()1(1) (--⇐⇐k k k k V m V m ; (5)k k k m V /)() (⇐μ ; (6)如果eps m m k k <--1,则显示特征值1λ和对应的特征向量)1(x ) ,终止; (7)1+⇐k k ,转(3) 注:如上算法中解方程)1()(-⇐k k AV μ可以使用Dololittle 分解法。本算法使用了数据规范化处理技术以防止计算过程中出现益出错误。 2、规范化反幂法程序 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 m1=fmax[v]; t=Abs[m1-m0]//N; t1=Abs[1/m1-1/m0]//N; Print["k=",k," 特征值=",N[1/m1,10]," 误差=",N[t1,10]]; Print[" 特征向量=",N[u,10]]]; If[k ≥nmax,Print["迭代超限"]] 说明:本程序用于求矩阵A 按模最小的特征值及其相应特征向量。程序执行后,先通过键盘输入矩阵A 、迭代初值向量)0(μ、精度控制eps 和迭代允许最大次数max n ,程序即可给出每次迭代的次数和对应的迭代特征值、特征向量及误差序列,它们都按10位有效数输出。其中最后输出的结果即为所求的特征值和特征向量序。如果迭代超出max n 次还没有求出满足精度的根则输出迭代超限提示,此时可以根据输出序列判别收敛情况。 程序中变量说明 a :存放矩阵A u :初始向量)0(μ和迭代过程中的向量)(k μ及所求特征向量