高斯消元(模板)
高斯消元就是求解多元一次方程组的模版具体的步骤就是每次从未知主元中选取一个作为主元找到系数最大的一个方程将方程的主元项系数化1带入其他方程使得其他方程的该主元系数变成0#include<iostream>#include<cstdio>#include<cmath>using namespace std;#define eps...
·
高斯消元就是求解多元一次方程组的模版
具体的步骤就是
每次从未知主元中选取一个作为主元
找到系数最大的一个方程
将方程的主元项系数化1
带入其他方程使得其他方程的该主元系数变成0
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define eps 1e-9
const int maxn = 105;
double a[maxn][maxn];//方程左边的矩阵
double x[maxn];//等式右边的值(求解之后x存的就是结果)
int n;
int equ,var;//方程数和未知数个数
//0无解 1有解
int Gauss(){
int i,j,k,col,max_r;
for(k = 0,col = 0;k<equ&&col<var;++k,++col){
max_r = k;
// cout<<k<<endl;
for(i = k+1;i<equ;++i) {//找到该变量系数最大的一行
if (fabs(a[i][col]) > fabs(a[max_r][col])) {
max_r = i;
}
}
if(fabs(a[max_r][col])<eps)return 0;
if(k!=max_r){//把最大的一行交换到第k行
for(j = col;j<var;++j){
swap(a[k][j],a[max_r][j]);
}
swap(x[k],x[max_r]);
}
x[k] /= a[k][col];//将第k行第col项系数化1
for(j = col+1;j<var;++j){
a[k][j] /= a[k][col];
}
a[k][col] = 1;
for(i = 0;i<equ;++i){//回带其他行
if(i!=k){
x[i] -= x[k]*a[i][col];
for(j = col+1;j<var;++j){
a[i][j] -= a[k][j]*a[i][col];
}
a[i][col] = 0;
}
}
}
return 1;
}
int main(){
int n;
scanf("%d",&n);
for(int i =0;i<n;++i){
for(int j =0;j<n;++j){
scanf("%lf",&a[i][j]);
if(j==n-1){
scanf("%lf",&x[i]);
}
}
}
equ = var = n;
int flag = Gauss();
if(flag!=0){
for(int i =0;i<n;++i){
printf("%.2f\n",x[i]);
}
}
else{
printf("No Solution\n");
}
}
更多推荐
已为社区贡献2条内容
所有评论(0)