模拟求逆過程寫就可以了
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;
}