编写了幂法的子函数,单位化时采用二范数,相关参数可以根据需求改动较为灵活
int main()
{
double a[3][3]={{6,-12,6},{-21,-3,24},{-12,-12,51}};
A_lamada1(a);
return 0;
}
double A_lamada1(double a[3][3]) //根据幂法计算矩阵A的按模最大的特征值lamada1
{
int n,i,j;
double u[3]={1};//向量初始化[1 0 0]
double y[3]; //单位化矩阵
double l; //模长
double temp=0;
double lamada=0;
double lamada1=0;
double e;
for(n=0;n<=100;n++)
{
for(i=0;i<3;i++) //计算模长
{
temp=temp+u[i]*u[i];
}
l=sqrt(temp);
temp=0;
for(i=0;i<3;i++)
{
y[i]=u[i]/l;
u[i]=0;
}
for(i=0;i<3;i++) //计算u(k+1)
{
for(j=0;j<3;j++)
{
u[i]=u[i]+a[i][j]*y[j];
}
}
for (i=0;i<3;i++) //计算lamada1
{
lamada1=lamada1+y[i]*u[i];
}
e=fabs(lamada1-lamada)/fabs(lamada1); //精度控制
if(e<eps)
{
printf(" %d lamada1=%10.6e",n,lamada1);
return lamada1;
break;
}
else
lamada=lamada1;
lamada1=0;
}
if(n>100)
{
printf("error");
}
}
100为最大计算次数,计算次数用n记录,例子中的矩阵的精确计算结果为45,eps为计算精度,本例中为1e-6,计算结果如下: