Gauss消元
解多元一次方程组
两两相消
For(j,i+1,n)
{
if(fabs(m[j][i])>eps)
d=-m[j][i]/m[i][i];
For(k,i,n+1) m[j][k]+=d*m[i][k];
}
模板题
高斯消元法
#include <iostream>
#include <cstdio>
#include <cmath>
#define For(i,s,e) for(int i=(s); i<=(e); i++)
#define Rep(i,s,e) for(int i=(s); i>=(e); i--)
using namespace std;
const int N=100+10;
const double eps=1e-6;
int n;
double m[N][N],x[N];
bool can=true;
void solve();
int main()
{
cin>>n;
For(i,1,n) For(j,1,n+1) scanf("%lf",&m[i][j]);
solve();
if(can) For(i,1,n) printf("%.2lf\n",x[i]);
return 0;
}
void solve()
{
int p;
double d,tmp;
For(i,1,n)
{
p=i;
For(j,i+1,n) if(fabs(m[i][i])<fabs(m[j][i])) p=j;
if(fabs(m[p][i])<eps)
{
puts("No Solution");
can=false;
return;
}
For(j,i,n+1) tmp=m[i][j], m[i][j]=m[p][j], m[p][j]=tmp;
For(j,i+1,n)
{
if(fabs(m[j][i])>eps)
d=-m[j][i]/m[i][i];
For(k,i,n+1) m[j][k]+=d*m[i][k];
}
}
x[n]=m[n][n+1]/m[n][n];
Rep(i,n-1,1)
{
For(j,i+1,n) m[i][n+1]-=x[j]*m[i][j];
x[i]=m[i][n+1]/m[i][i];
}
}