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