数值分析课题二 矩阵求逆

来源:互联网 发布:ff视频软件 编辑:程序博客网 时间:2024/06/05 03:37

模拟求逆过程写就可以了

e是单位矩阵,只通过行变换,把原矩阵变成单位矩阵。

消元的时候不能选主元。

#include <iostream>#include <cstdio>#include <math.h>using namespace std;const int MAXN = 1000;int n;double a[MAXN][MAXN];double e[MAXN][MAXN];void init(){    for(int i = 0;i<n;i++){        for(int j = 0;j<n;j++){            e[i][j] = i == j?1:0;        }    }}void low_mat(){    for(int k = 0;k<n;k++){///往下扫        for(int i = k+1;i<n;i++){            double l = -a[i][k]/a[k][k];            for(int j = k;j<n;j++){                a[i][j] += l*a[k][j];                e[i][j] += l*e[k][j];            }        }    }}void up_mat(){    for(int k = n-1;k>=0;k--){///再往上扫            for(int i = k-1;i>=0;i--){///千万别选主元,会跪                double l = -a[i][k]/a[k][k];                for(int j = k;j>=0;j--){                    a[i][j] += l*a[k][j];                    e[i][j] += l*e[k][j];                }            }    }}void I(){    for(int i  =0;i<n;i++){            for(int j  =0;j<n;j++){                e[i][j] /= a[i][i];            }    }}int main(){    freopen("in.txt","r",stdin);    while(cin >> n){        init();        for(int i  =0;i<n;i++){            for(int j = 0;j<n;j++){                scanf("%lf",&a[i][j]);            }        }        low_mat();        up_mat();        I();        for(int i  =0;i<n;i++){            for(int j  =0;j<n;j++){                printf("%10.5lf",e[i][j]);            }            cout <<endl;        }    }    return 0;}


0 0
原创粉丝点击