高斯消元法(C++附注释)

数值分析/计算方法,欢迎交流

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>

int Read() {
    int x = 0;
    char c = getchar();
    while (c < '0' || c > '9')
        c = getchar();
    while (c >= '0' && c <= '9')
        x = x * 10 + (c ^ 48), c = getchar();
    return x;
}

const double eps = 1e-7;

inline double Abs(const double &x) {
    return x < 0 ? -x : x;
}

inline int Comp(const double &x,const double &y) {
    if (Abs(x-y) < eps)
        return 0;
    return Abs(x) > Abs(y) ? 1 : -1;
}

const int MAXN = 100;

int N;
double A[MAXN + 5][MAXN + 5], Ans[MAXN + 5];

int main() {
    N = Read();
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N + 1; j++)
            scanf("%lf", &A[i][j]);
    for(int i = 1; i <= N; i++) {
        int pos = i;
        for(int j = i + 1; j<= N; j++)
            if(Comp(A[j][i], A[pos][i]) == 1)
                pos = j;
        // 这里找A[j][i]最大的是为了减少精度误差 与算法正确性无关
        if(Comp(A[pos][i], 0) == 0) {
            puts("No Solution");
            return 0;
        }
        for(int j = 1; j <= N + 1; j++)
            std::swap(A[pos][j], A[i][j]);
        // 把A[j][i]最大的那行换上去
        double tmp = A[i][i];
        for(int j = i; j <= N + 1; j++)
            A[i][j] /= tmp;
        // 操作一
        for(int j = i + 1; j <= N; j++){
            tmp = A[j][i];
            for(int k = i; k <= N + 1; k++)
                A[j][k] -= A[i][k] * tmp;
        }
        // 操作二
    }
    for(int i = N; i >= 1; i--) {
        Ans[i] = A[i][N + 1];
        for(int j = N; j >= i + 1; j--)
            Ans[i] -= Ans[j] * A[i][j];
    }
    for(int i = 1; i <= N; i++)
        printf("%.2f\n", Ans[i]);
    system("pause");
	return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
全主元高斯消元法是一种解线性方程组的方法,它可以通过消元和回代的方式求解方程组的解。以下是一个C++实现的例子: ```c++ #include <iostream> #include <cmath> using namespace std; const int MAXN = 100; const double eps = 1e-10; class GAUS { private: int n; double a[MAXN][MAXN], b[MAXN]; int p[MAXN], q[MAXN]; public: GAUS(int n) : n(n) {} void input() { cout << "请输入系数矩阵A和常数向量B:" << endl; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> a[i][j]; } cin >> b[i]; } } void gauss() { for (int i = 1; i <= n; i++) { p[i] = q[i] = i; } for (int k = 1; k <= n; k++) { double maxa = 0; int maxp = 0, maxq = 0; for (int i = k; i <= n; i++) { for (int j = k; j <= n; j++) { if (fabs(a[p[i]][q[j]]) > maxa) { maxa = fabs(a[p[i]][q[j]]); maxp = i; maxq = j; } } } if (maxa < eps) { cout << "矩阵奇异,无法求解!" << endl; return; } if (maxp != k) { swap(p[k], p[maxp]); } if (maxq != k) { swap(q[k], q[maxq]); } for (int i = k + 1; i <= n; i++) { double f = a[p[i]][q[k]] / a[p[k]][q[k]]; b[p[i]] -= f * b[p[k]]; for (int j = k + 1; j <= n; j++) { a[p[i]][q[j]] -= f * a[p[k]][q[j]]; } } } } void output() { cout << "方程组的解为:" << endl; for (int i = n; i >= 1; i--) { double sum = 0; for (int j = i + 1; j <= n; j++) { sum += a[p[i]][q[j]] * b[p[j]]; } b[p[i]] = (b[p[i]] - sum) / a[p[i]][q[i]]; } for (int i = 1; i <= n; i++) { cout << "x" << i << " = " << b[p[i]] << endl; } } }; int main() { GAUS c(4); c.input(); c.gauss(); c.output(); return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值