temp+=x[i]*y[i]; 
    return temp; 
    } 
void unit(double x[N],double (&y)[N]){   //将向量单位化,采用二范数 
     int i; 
     double model=0; 
     for(i=0;i
     det*=B[s][i];} 
    return ; 
     } 
void diedai(double B[5][501],double u[501],double y[501]){//迭代求解 Au=y 
     int i,t,s=2,r=2; 
     double c[501]; 
     for(i=0;i=0;i--){ 
         u[i]=c[i]; 
         for(t=i+1;t<=Min(i+s,500);t++) 
         u[i]=u[i]-B[i-t+s][t]*u[t]; 
         u[i]=u[i]/B[s][i]; 
         } 
     return ; 
} 
void matrix(double A[N],double x[N],double *y){// 计算矩阵和向量的乘积 
     int i; 
     double b=0.16,c=-0.064; 
     y[0]=(A[0]*x[0])+(b*x[1])+(c*x[2]); 
     y[1]=b*x[0]+A[1]*x[1]+b*x[2]+c*x[3]; 
     for(i=2;ieps){//达到精度要求结束运算 
         b1=b2; 
         unit(u,y); 
         matrix(A,y,u); 
         b2=multiply(u,y); 
         } 
     return b2; 
     } 
double inversepowermothed(double A[N])         //反幂法求解 A 的特征值 
3 
 
{ 
    double b1=1,b2=0,det; 
    int i; 
    double u[N],y[N],B[5][N]; 
    doolittle(A,B,det); 
    for(i=0;ieps){ 
       b2=b1; 
       unit(u,y); 
       diedai(B,u,y); 
       b1=multiply(u,y); 
       } 
    return 1/b1; 
} 
 
int main() 
{ 
 int i,j; 
 double A[501],B[5][501]; 
 double lamda1,lamda501,lamdas,p,q,det,cond; 
     for(j=0;j0){           //判断第一次求的特征值 p,若 p 则它为最大特征 
         lamda501=p; 
         lamda1=q; 
         } 
    else{ 
         lamda501=q; 
          lamda1=p; 
          } 
     doolittle(A,B,det);        
      lamdas= inversepowermothed (A); 
      cond=fabs(p/lamdas); 
      printf("λ1=%.12e\n",lamda1); 
      printf("λ501=%.12e\n",lamda501); 
      printf("λs=%.12e\n\n",lamdas); 
      printf("\t 要求接近的值 \t\t\t   实际求得的特征值\n"); 
    for(i=0;i<39;i++){//反幂法求得与给定值接近的特征值 
4 
 
        p=lamda1+(i)*(lamda501-lamda1)/40; 
        for(j=0;j
μ24:  2.064165983107e+000    λi24:  2.060330427561e+000 
μ25:  2.574707160812e+000    λi25:  2.558075576223e+000 
μ26:  3.085248338516e+000    λi26:  3.080240508465e+000 
μ27:  3.595789516221e+000    λi27:  3.613620874136e+000 
μ28:  4.106330693926e+000    λi28:  4.091378506834e+000 
μ29:  4.616871871631e+000    λi29:  4.603035354280e+000 
μ30:  5.127413049336e+000    λi30:  5.132924284378e+000 
μ31:  5.637954227041e+000    λi31:  5.594906275501e+000 
μ32:  6.148495404746e+000    λi32:  6.080933498348e+000 
μ33:  6.659036582451e+000    λi33:  6.680354121496e+000 
μ34:  7.169577760156e+000    λi34:  7.293878467852e+000 
μ35:  7.680118937861e+000    λi35:  7.717111851857e+000 
μ36:  8.190660115566e+000    λi36:  8.225220016407e+000 
μ37:  8.701201293271e+000    λi37:  8.648665837870e+000 
μ38:  9.211742470976e+000    λi38:  9.254200347303e+000 
μ39:  9.722283648681e+000    λi39:  9.724634099672e+000 
行列式 detA=2.772786141752e+118 
条件数 cond(A)=1.925204271046e+003 
 
四  问题讨论 
* 初始迭代向量的选取对计算结果的影响,并说明原因 
根据幂法算法,设 X1,X2,…,Xn 为 A 的 n 个线性无关特征向量,|λ1|>|λ2|>…>|λn|为其
对应特征值。初始迭代向量μ0=α1*X1+α2*X2+…+αn*Xn。如果初始迭代的向量选取使得μ
0 在特征向量 X1 上的分量α1=0,则因为计算误差,理论上迭代次数足够大后仍可以得到λ
1 的特征向量。但是实际计算中无法使迭代次数充分大,实际中对λ1 的求解具有精度限制,
所以如果初始向量选取不当使得α1=0则很大可能得不到实际的结果。 
6