西华数学与计算机学院上机实践报告
课程名称:计算方法A
年级:2010级 上机实践成绩: 指导教师:严常龙
姓名:李国强 上机实践名称:反幂法求矩阵按模最小特征值
学号:362011********* 上机实践日期:2013.12.18
上机实践编号:6
上机实践时间:14:00 一、目的
1.通过本实验加深对反幂法的构造过程的理解;
2.能对反幂法提出正确的算法描述编程实现,得到计算结果。
二、内容与设计思想 自选方阵,用反幂法求解其按模最小特征值。
可使用实例:
⎪⎪⎪⎭
⎫ ⎝⎛---=90688465441356133A
三、使用环境
操作系统:Win 8
软件平台:Visual C++ 6.0
四、核心代码及调试过程
#include<stdio.h>
#include<math.h>
#define MAX_N 20 //矩阵最大维数
#define MAXREPT 100
#define epsilon 0.00001 //求解精度
int main()
{
int n;
int i,j,k;
double xmax,oxmax;
static double a[MAX_N][MAX_N];
static double l[MAX_N][MAX_N],u[MAX_N][MAX_N];
static double x[MAX_N],nx[MAX_N];
printf("\n 请输入矩阵阶数n:"); //输入矩阵维数
scanf("%d",&n);
if(n>MAX_N)
{
printf("the input n is larger than MAX_N,please redefine the MAX_N.\n");
return 1;
}
if(n<=0)
{
printf("please input a number between 1 and %d.\n",MAX_N);
return 1;
}
//输入A矩阵
printf("请输入矩阵的值a[i][j] i,j=0...%d;\n",n-1);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%lf",&a[i][j]);
for(i=0;i<n;i++)
x[i]=1;
oxmax=0;
for(i=0;i<MAXREPT;i++)
{
for(j=0;j<n;j++) //幂乘
{
nx[j]=0;
for(k=0;k<n;k++)
nx[j]+=a[j][k]*x[k];
}
xmax=0.0;
for(j=0;j<n;j++) //规范化
if(fabs(nx[j])>xmax)
xmax=fabs(nx[j]);
for(j=0;j<n;j++)
nx[j]/=xmax;
for(j=0;j<n;j++)
x[j]=nx[j];
if(fabs(xmax-oxmax)<epsilon)
{
printf("solve...max lamda=%lf\n",xmax); //输出
printf("the vector is:\n");
for(i=0;i<n;i++)
printf("%f\n",nx[i]);
break;
//return 0;
}
oxmax=xmax;
}
//printf("after %d repeat ,max no result ...\n",MAXREPT); for(i=0;i<n;i++)
u[i][i]=1; //U矩阵对角元为
for(k=0;k<n;k++)
{
for(i=k;i<n;i++) //计算L矩阵
{
l[i][k]=a[i][k];
for(j=0;j<=k-1;j++)
l[i][k]-=(l[i][j]*u[j][k]);
}
for(j=k+1;j<n;j++) //计算U矩阵
{
u[k][j]=a[k][j];
for(i=0;i<=k-1;i++)
u[k][j]-=(l[k][i]*u[i][j]);
u[k][j]/=l[k][k];
}
}
for(i=0;i<n;i++)
x[i]=1;
for(i=0;i<MAXREPT;i++)
{
for(j=0;j<n;j++) //反幂乘
{
nx[j]=x[j];
for(k=0;k<=j-1;k++)
nx[j]-=l[j][k]*nx[k];
nx[j]/=l[j][j];
}
for(j=n-1;j>=0;j--)
{
x[j]=nx[j];
for(k=j+1;k<n;k++)
x[j]-=u[j][k]*x[k];
}
xmax=0.0;
for(j=0;j<n;j++)
if(fabs(x[j])>xmax)
xmax=fabs(x[j]);
for(j=0;j<n;j++)
x[j]/=xmax;
if(fabs(xmax-oxmax)<epsilon)
{
printf("solve... min lamda=%lf\n",1/xmax); //输出
printf("the vector is:\n");
for(i=0;i<n;i++)
printf("%f\n",x[i]);
break;
//return 0;
}
oxmax=xmax;
}
return 1;
}
显示结果:
五、总结
本次试验利用C语言实现了用反幂法求解其按模最小特征值,通过本实验加深对反幂法的构
造过程的理解。
对于利用C语言实现该算法有了进一步的掌握,为今后的深入学习打下坚实基础。
六、附录
《数值计算方法与算法(第二版)》,张韵华主编,2012.1。