高斯消元

高斯消元是建立矩阵的基础上的,其基本思路和初一下的二元一次方程的求解思路基本相同。
\(e.g.\)

\[\begin{cases} x+y=3\\ x-y=1\\ \end{cases}\\ \downarrow\\ \begin{cases} x+y=3\\ -2y=-2\\ \end{cases}\\ \downarrow\\ \begin{cases} x=2\\ y=1\\ \end{cases}\\ \]

具体实现 \(\downarrow\)


inline int gauss(int n, int m) {   //n元,m个等式
	int c = 0;//当前主元数
	for (int i = 1; i <= n; ++i) { //枚举第i元(列)
		bool f = 0;
		for (int j = c + 1; j <= m; ++j) { //枚举第j个等式(行)
			if (fabs(a[j][i]) > eps) { //寻找系数不为0的行
				++c, f = 1;
				std::swap(a[j], a[c]);//交换
				break;
			}
		}
		if (!f) continue;
		double p = a[c][i];
		for (int j = 1; j <= n + 1; ++j) { //系数化为一
			a[c][j] = a[c][j] * 1.0 / p;
		}
		for (int j = 1; j <= m; ++j) {	//加减消元
			if (j != c && fabs(a[j][i]) > eps) {					
				double q = a[j][i];
                for (int k = i; k <= n + 1; ++k) {
                    a[j][k] -= a[c][k] * q;
                }
			}
		}
	}
	for (int i = c + 1; i <= m; ++i)
        if (fabs(a[i][n + 1]) > eps) return -1;//无解
	if (c == n) return 0;//唯一解
    return 1;//无穷多解
}
posted @ 2024-07-20 20:03  Optimist_Skm  阅读(24)  评论(1)    收藏  举报