您的位置:首页 > 其它

数值分析课题二 矩阵求逆

2015-06-05 22:54 501 查看
模拟求逆过程写就可以了

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