数值分析
幂法求矩阵A按模最大的特征值及其
特征向量
幂法的主要思想
设 n
n ij R a A ⨯∈=)( ,其特征值为i λ ,对应特征向量为
),
,,1(n i x i
=即
i i i x Ax λ= )
,,1(n i =,且
x 1,······,x n
线性无关。
求矩阵A
的主特征值及对应的特征向量。
幂法的基本思想: 任取一个非零初始向量
v 0 ∈R n 且v 0≠0,
由矩阵A 的乘幂构造一向量序列:
称{
v
k }为迭代向量,
A 特征值中 λ1为强占优,即▕ λ1▕>▏λ2 ▏>······>▏λn ▏,
{x 1,x 2,······,x n }线性无关,即{x 1,x 2,······,x n }为R n 中的一
个基,于是对任意的初始向量v 0
∈R n 且
v
0≠0有展开式。
(v
0 用{x i }
的线性组合表示)
(且设01
≠α) 则
当k =2,3,… 时,v
k =
A v
k-1 =
A k v 0
⎩
⎨⎧0
1Av v =0
212v A Av v ==01
1
v A Av v k k k ++==)
,,1,0(n k =∑==n i i i x v 1
0 α)(221101n n x x x A v A v
ααα+++==n
n x A x A x A
ααα+++=2211n
n n x x x λαλαλα+++=222111)
(111
+≡x k
αλk ε
其中 由假设▕ λ1▕>▏λ2 ▏>······>▏λn ▏,得 ,从而 即,0lim =∞→k k ε且收敛速度由比值||12λλ=r 确定。
所以有
说明,当k 充分大时,有1
11
x v k k
αλ≈,或 k k
v 1λ 越来越接近特征
向量
规范化幂法的算法
①输入矩阵A 、初始向量v (0),误差eps ,实用中一般取v (0)=
(1,1,···,1)T ; ②k ←1;
③计算v
(k) ←Au (k-1);
④
m k
←max{ v (k) },m k-1
←{ v (k-1) };
⑤u (k) ←v (k)/ m k
;
⑥如果▕ m k - m k-1▕<eps ,则显示特征值λ1
←和对应的特征向
量x (1),终止;
⑦k=k+1,转③。
n k n n k k x x
)()(
1
2122λλαλλαε++=),,2(1||1n i i =<λλ
),,,2(0)(lim 1n i k i k ==∞→λλ111
lim x v k k
k
αλ=∞
→。
11x
α
幂法- C语言程序
#include<stdio.h>
#include<math.h>
void LOOP(float a[20][20],float u[20],int); //矩阵最高阶数是20,可以更改最高阶数float MAX(float u[20],int);
void main(void)
{
float a[20][20],u[20],x[20],y,z;
int i,j,n;
printf("请输入方阵阶数:\n");
scanf("%d",&n);
printf("请按行输入各矩阵元素值:");
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
scanf("%f",&a[i][j]);
}
}
printf("请输入初次迭代向量:");
for(i=0;i<=n-1;i++)
{
scanf("%f",&u[i]);
}
y=MAX(u,n);
do
{
z=y;
LOOP(a,u,n);
y=MAX(u,n);
for(i=0;i<=n-1;i++)
{
x[i]=u[i]/y;
u[i]=x[i];
}
}
while(fabs(z-y)>=0.0000005);
printf("矩阵特征值λ=%f\n",y);
printf("矩阵特征向量x:\n");
for(i=0;i<=n-1;i++)
{
printf("%10f\n",x[i]);
}
}
void LOOP(float a[20][20],float u[20],int n) {
float S,U[20];
int i,j;
for(i=0;i<=n-1;i++)
{
U[i]=u[i];
}
for(i=0;i<=n-1;i++)
{
S=0.0;
for(j=0;j<=n-1;j++) {
S=S+a[i][j]*U[j]; }
u[i]=S;
}
}
float MAX(float u[20],int n)
{
float max;
int i;
max=u[0];
for(i=0;i<=n-1;i++)
{
if(u[i]>max)
{
max=u[i];
}
}
return(max);
}
幂法- C语言程序检验
(见书P89 页)
【例4-1】
得出的结果与书上结果相同!
创新点:本程序可以更改矩阵大小,使其更加符合选择性,还可以改变误差的范围,程序简单易懂,运用数组解决矩阵输入的问题,简化了C语言程序。
结语
通过本次数值分析实验的研究,我发现我收获颇多:这次研究不仅加深了我对幂法以及相关求矩阵的特征值及其特征向量方法的了解,还使我对数值分析这门课有了更深的领悟:数值分析在计算机使用方面有很强的实用性。
一个问题,只要给出一个算法,就可以编出一个完美的程序,而且程序在算法结构以及误差分析方面有很高的准确度。
我在C语言方面也得到了很大的提高,编程更加流畅且出现错误的机会大大减少,查错的能力也有很大的进步。