数值分析2.1 Gauss(高斯)消去法

来源:互联网 发布:苹果电脑软件怎么卸载 编辑:程序博客网 时间:2024/05/22 05:23

顺序高斯消去法:

代码:

#include <iostream>#include <cstdio>using namespace std;const int MAXN = 10000;double a[MAXN][MAXN];double b[MAXN];double x[MAXN];int main(){    int n;    double l;    while(cin >> n){///方程组阶数        for(int i = 0;i<n;i++)cin >> b[i];///输入方程组右端        for(int i = 0;i<n;i++){            for(int j = 0;j<n;j++){                cin >> a[i][j];///系数矩阵            }        }        ///消元过程        for(int k = 0;k<n-1;k++){///消元行            for(int i = k+1;i<n;i++){///被消元行                l = a[i][k]/a[k][k];                for(int j = k;j<n;j++){                    a[i][j]-=l*a[k][j];                }                b[i]-=b[k]*l;            }        }        ///回带过程        for(int i = n-1;i>=0;i--){                x[i] = b[i];            for(int j = n-1;j>i;j--){                x[i] -= a[i][j]*x[j];            }            x[i] /= a[i][i];        }        ///        for(int i = 0;i<n;i++){            if(!i)cout << x[i];            else cout << " " << x[i];        }        cout << endl;    }    return 0;}


列主元高斯消去法

没啥区别,就是在消去过程,添加一个选主元过程,记住交换的时候,方程组右端也要交换

代码:

#include <iostream>#include <cstdio>#include <math.h>using namespace std;const int MAXN = 10000;double a[MAXN][MAXN];double b[MAXN];double x[MAXN];int main(){    int n;    double l;    double maxs;    while(cin >> n){        for(int i = 0;i<n;i++)cin >> b[i];        for(int i = 0;i<n;i++){            for(int j = 0;j<n;j++){                cin >> a[i][j];            }        }        ///消元过程        for(int k = 0;k<n-1;k++){///消元行            int cur = k;            maxs = fabs(a[k][k]);            for(int i = k;i<n;i++)if(maxs<fabs(a[i][k])){maxs = fabs(a[i][k]);cur = i;}///选主元            if(cur != k){                double temp;                for(int j = k;j<n;j++){                    temp = a[k][j];                    a[k][j] = a[cur][j];                    a[cur][j] = temp;                }                temp = b[k];b[k] = b[cur];b[cur] = temp;            }            for(int i = k+1;i<n;i++){///被消元行                l = a[i][k]/a[k][k];                for(int j = k;j<n;j++){                    a[i][j]-=l*a[k][j];                }                b[i]-=b[k]*l;            }        }        ///回带过程        for(int i = n-1;i>=0;i--){                x[i] = b[i];            for(int j = n-1;j>i;j--){                x[i] -= a[i][j]*x[j];            }            x[i] /= a[i][i];        }        ///        for(int i = 0;i<n;i++){            if(!i)cout << x[i];            else cout << " " << x[i];        }        cout << endl;    }    return 0;}



0 0
原创粉丝点击