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

幂法求矩阵特征向量和特征值的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;
}

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值