高斯消元
高斯消元是建立矩阵的基础上的,其基本思路和初一下的二元一次方程的求解思路基本相同。
\(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;//无穷多解
}

浙公网安备 33010602011771号