高斯消元模板

来源:互联网 发布:阿里云镜像是什么 编辑:程序博客网 时间:2024/06/05 19:39

高斯消元:

就是加减消元法。
要消x_i时, 注意一定要选取一个系数最大的, 不然就会出Bug。
还是看懂标比较实在。

#include<cstdio>#include<algorithm>#define abs(a) ((a) < 0 ? -(a) : (a))#define fo(i, x, y) for(int i = x; i <= y; i ++)using namespace std;const int Maxn = 505;int n;double a[Maxn][Maxn], ans[Maxn];void Init() {    scanf("%d", &n);    fo(i, 1, n)        fo(j, 0, n)            scanf("%lf", &a[i][j]); //a[i][0]是常数,它和未知数看作同一边,所以求答案时要取反。 }void Solve_equation() {    fo(i, 1, n) {        int w = i;        fo(j, i + 1, n) if(abs(a[w][i]) < abs(a[j][i])) w = j;        if(a[w][i] == 0) continue;         fo(j, 0, n) swap(a[w][j], a[i][j]);        fo(j, 1, n) if(i != j) {            double c = a[j][i] / a[i][i];            fo(k, 0, n) a[j][k] -= a[i][k] * c;        }    }    fo(i, 1, n) {        if(a[i][i] == 0) continue; //此时如果a[i][0] == 0,x_i为自由元,否则无解。        ans[i] = - a[i][0] / a[i][i]; //取反。     }}void End() {    fo(i, 1, n)        printf("%lf ", ans[i]); }int main() {    Init();    Solve_equation();    End();}
1 1
原创粉丝点击