幂法

mac2024-04-05  40

编写了幂法的子函数,单位化时采用二范数,相关参数可以根据需求改动较为灵活

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,计算结果如下:

 

最新回复(0)