幂法求矩阵A按模最大的特征值及其特征向量

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数值分析

幂法求矩阵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

#include

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++)

相关文档
最新文档