data数组里面是增广矩阵
/***********************************************\
|Author: Messyidea
|Created Time: 2014/3/25 23:07:45
|File Name: 顺序消元法.cpp
|Description:
\***********************************************/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
double data[4][5] = {
{1.1348,3.8326,1.1651,3.4017,9.5342},
{0.5301,1.7875,2.5330,1.5435,6.3941},
{3.4129,4.9317,8.7643,1.3142,18.4231},
{1.2371,4.9998,10.6721,0.0147,16.9237}
};
double ans[4];
int pos = 0;
bool solve(double data[4][5],int n,int m){
double maxn;
int p;
for(int i=0;i<n;++i){
//找主元,并交换
maxn = data[i][i];
p = i;
for(int j=i+1;j<n;++j){
if(fabs(maxn) < fabs(data[j][i])){
p = j;
maxn = data[i][i];
}
}
if(i!=p)
{
for(int k=i;k<m;++k){
swap(data[i][k],data[p][k]);
}
}
//判断是否可解
if(data[i][i] == 0) return false;
//高斯消元
for(int j=i+1;j<n;++j){
double shang = data[j][i] / data[i][i];
for(int k=i;k<m;++k){
data[j][k] -= data[i][k]*shang;
}
}
}
//回代
pos = 0;
for(int i=n-1;i>=0;--i){
double sum = data[i][m-1];
for(int j=0;j<pos;++j){
sum -= data[i][n-1-j] * ans[j];
}
sum/=data[i][i];
ans[pos++] = sum;
}
return true;
}
int main() {
//当可解的情况下输出解
if(solve(data,4,5)){
for(int i=0;i<pos;++i){
printf("%.8lf ",ans[i]);
}
printf("\n");
}
else{
printf("error\n");
}
return 0;
}