您的位置:首页 > 编程语言 > C语言/C++

幂法求矩阵特征向量和特征值的C语言程序

2010-02-08 16:42 1081 查看
幂法求矩阵特征向量和特征值的C语言程序

幂法的原理大概每本数值分析的书上都会讲吧,这里参考的是清华大学出版社的《数值分析》第四版,在此就不赘述原理了。

/*Author:RainMan
Date:2009-12-28
请使用符合C99标准的编译器编译以下程序
输入文件由以下格式构成,第一行是矩阵的维数
以下各行是矩阵的值,比如
3 3
1.0 1.0 0.5
1.0 1.0 0.25
0.5 0.25 2.0
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

void multiple(double**A,double *V,int dim_x,int dim_y);
double max(double *V,int dim);
void div_matrix(double *V,int dim,double m);

int main(){
FILE *file = fopen("dengjin.txt","r");
int dim_x,dim_y;
double **A,*V;
double miu0 = 0,miu1 = 10;/*just make sure to enter the loop*/
fscanf(file,"%d %d",&dim_x,&dim_y);

/*load in data*/
A = (double **)malloc(sizeof(double *)*dim_x);
V = (double *)malloc(sizeof(double)*dim_y);
for(int i=0;i<dim_x;i++)
A[i] = (double *)malloc(sizeof(double)*dim_y);

for(int i=0;i<dim_x;i++)
for(int j=0;j<dim_y;j++)
fscanf(file,"%lf",&A[i][j]);

for(int i=0;i<dim_y;i++)
V[i] = 1;/*initialing a vector with any value*/

while(fabs(miu1-miu0) >= 1E-8){
multiple(A,V,dim_x,dim_y);
miu0 = miu1;
miu1 = max(V,dim_y);
div_matrix(V,dim_y,miu1);
for(int i=0;i<dim_y;i++)
printf("%10.8lf ",V[i]);
puts("");
}
printf("Eigenvalue: %10.8lf/n",miu1);
//delocating

free(V);
for(int i=0;i<dim_y;i++)
free(A[i]);
free(A);

return EXIT_SUCCESS;
}

void multiple(double**A,double *V,int dim_x,int dim_y){
double *tmp = (double *)malloc(sizeof(double)*dim_y);
for(int i=0;i<dim_y;i++)
tmp[i] = 0;

for(int i=0;i<dim_x;i++)
for(int j=0;j<dim_y;j++)
tmp[i] += A[i][j]*V[j];

for(int i=0;i<dim_y;i++)
V[i] = tmp[i];
free(tmp);
}

double max(double *V,int dim){
double tmp = V[0];
for(int i=1;i<dim;i++)
if(fabs(V[i]) > fabs(tmp))
tmp = V[i];
return tmp;
}

void div_matrix(double *V,int dim,double m){
for(int i=0;i<dim;i++)
V[i] /= m;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: