数值分析
第二次大作业
2015-11-20
的全部特征值,并对其中的每一个实特征值求相应
第二题:试求矩阵
A
[
a
a
ij
]ij
10*10
的特征向量。已知:
sin(0.5 0.2 )(
{
1.5cos( 1.2 )(
i
i
j
j
i
i
j
j
)
)
(i,j=1,2,……,10)
第一问:算法设计
(1) 矩阵 A 的拟三角化
为了减少计算量,一般先利用 Householder 矩阵对矩阵 A 作相似变换,把 A
化做拟上三角矩阵(Hessenberg 矩阵)
(
A
n
)1
~[
a
ji
]
10
10
,其中
ji 时
jia
~
0
。
实际计算时不必具体形成矩阵 iH ,并可避免矩阵与矩阵相乘。对实矩阵 A 的拟
上三角化具体算法如下:
记
A )1(
A
, 并 记
)(rA 的 第 r 列 至 第 10 列 的 元 素 为
iar
()(
ij
2,1
,...,
;10
rrj
,
,1
r
,...,
2
)10
。
对于
2,1r
8
,...,
执行:
Step1: 若
()(
riar
ir
,2
r
,...,
3
)10
全为零,则令
(
r
A
)1
r
)(
A
;则转 Step5;
否则转 Step2;
Step2:计算
d
r
n
ri
r
2)( )
a
(
ir
1
c
r
sgn(
a
r
)(
,1
rr
)
d
r
(若
rra
)(
r
,1
0
,则取
c )
r d
r
acch
)(
r
rrr
,1
2
r
r
Step3:令
u
r
Step4:计算
p
r
0(
,...,
,0
a
r
)(
rr
,1
,...,
Tr
)(
a
)
nr
n
R
Tr
)(
huA
r
/
r
q
r
r
)(
huA
r
/
r
t
r
r
T
hup
r
/
r
r
utq
rr
r
r
(
A
)1
)(
r
A
T
puu
rr
rr
T
Step5:继续。
当此算法执行完成后,就得到与原矩阵 A 相似的拟上三角矩阵 )1
( nA 。
(2) 矩阵 A 的特征值求解
使用带双步位移的 QR 方法求实矩阵 A 全部特征值的具体算法如下:
Step1:使用矩阵的拟上三角化的算法把矩阵 A 化为拟上三角矩阵 )1
( nA ;给定
精度水平和迭代最大次数 M。
Step2:记
(
AA
1
n
)1
[ )1(
a
]
nnij
,令
k
,1
nm
。
Step3:如果
转 Step4;否则转 Step5。
mma
)(
k
,
1
,则得到 A 的一个特征值 k
mma ,置
mm
:
1
(降阶),
Step4:如果 m=1,则得到 A 的一个特征值 )(
ka ,转 Step11;如果 m=0,则直接
11
转 Step11;如果 m>1,则转 Step3。
Step5:求二阶子阵
D
k
k
)(
a
mm
,1
)(
k
a
,
mm
1
1
k
)(
a
mm
,1
)(
k
a
mm
的两个特征值 1s 和 2s ,即计算二次方
程
2
k
)(
(
a
mm
,1
1
)(
k
a
mm
)
det
D
k
0
的两个根 1s 和 2s 。
Step6:如果 m=2,则得到 A 的两个特征值 1s 和 2s ,转 Step11;否则转 Step7。
Step7:如果
mma
)(
k
,1
2
,则得到 A 的两个特征值 1s 和 2s ,置
mm
:
2
(降
阶),转 Step4;否则转 Step8。
mm
Step8:如果 k=L;则计算终止,未得到 A 的全部特征值;否则转 Step9。
Step9:记
)
mji
,计算
k
a
ij
A
k
1(
,
)(
k
as
mm
,1
k
)(
a
mm
1
)(
k
at
mm
,1
k
)(
a
1
mm
)(
k
aa
mm
)(
k
mm
,
,1
1
M
k
2
A
k
sA
k
tI
M
k
RQ
kk
k
T
k
QAQ
kk
A 1
Step10:置 k:=k+1,转 Step3。
Step11:A 的全部特征值已计算完毕,停止计算。
在上述算法中,从 kM 的 QR 分解
M
RQ
kk
到计算
k
H
n
1
MHH
k
1
2
R
k
,
A
k
1
H
n
1
HHAHH
2
k
1
1
2
A 1
k
QAQ
kk
T
k
,实质上是
H
n
1
。 其 中 iH 是
Householder 矩阵,且
Q
k
HH
2
1
H
n
1
,参照 QR 分解法,可把 kM 的 QR 分解
与 1kA 的计算用下列算法实现:
记
B
1
M
k
mmij
)1(
b
,
B
r
r
)(
b
ij
mm
,
C 1
kA
。
对于
r
2,1
,...,
m
1
执行
Step1:若
ribr
()(
ir
,1
r
,...,
2
)
m
全为 0,则令
B 1
r
B
r
,
C 1
r
C
r
,
转 Step5;否则转 Step2。
Step2:计算
d
r
c
r
m
r
2)( )
b
(
ir
ri
sgn(
db
r
)(
r
)
rr
(若
)(
r
rrb
0
,则取
c )
r d
r
)(
r
bcch
rrr
2
r
r
0(
,...,
,0
r
)(
b
rr
c
r
,...,
r
)(
b
mr
)
m
R
。
u
r
Step3:令
Step4:计算
r
huB /
r
T
r
r
B
r
1
uB
T
rr
r
p
r
q
r
t
r
r
huC
r
/
T
r
r
huC
r
rr
/
hup
r
/
r
T
r
utq
rr
r
C
r
1
C
r
T
T
puu
rr
rr
Step5:继续。
此算法执行完后,就得到
A 1
k
C
m
,所需的乘法运算次数只是 2m 级的
第二问:源代码(C)
1、 #include
2、 #include
3、 #include
4、 #define N 10
5、 #define E 1.0e-12
6、 #define MAX 10000
double q[N][N],r[N][N],qr[N][N];
void QR(double A[N][N],double Q[N][N],double R[N][N]);
void EigenVaule(double A[N][N],double chaR[N],double chaI[N]);
void EigenVector(double V[N][N],double T[N]);
if (fabs(a[i][j])
51、
52、
53、
54、
55、
56、
57、
58、
59、
60、
61、
62、
63、
64、
65、
66、
67、
68、
69、
70、
71、
72、
73、
74、
75、
76、
77、
78、
79、
80、
81、
82、
83、
84、
85、
86、
87、
88、
89、
90、
91、
92、
93、
94、
printf("\n\n\n");
printf("拟上三角矩阵 A 的 QR 分解:\n");
printf("上三角矩阵 R:\n");
for(i=0;i
95、
96、
97、
98、
99、
100、
101、
102、
103、
104、
105、
106、
107、
108、
109、
110、
111、
112、
113、
114、
115、
116、
117、
118、
119、
120、
121、
122、
123、
124、
125、
126、
127、
128、
129、
130、
131、
132、
133、
134、
135、
136、
137、
138、
printf("\n");
}
printf("\n");
for(i=0;i
printf("λ%2d =%.12e
\n",j+1,chaR[j]);
else if(chaI[j]>E)
else printf("λ%2d =%.12e %19.11ei\n",j+1,chaR[j],chaI[j]);
+%18.11ei\n",j+1,chaR[j],chaI[j]);
}
}
if (i==5)
{
if(fabs(chaI[j])<=E)
printf("λ%2d =%.12e
}
printf("\n\n\n");
for(i=0;i