有点线代的知识:
const double EPS = 1e-8; typedef vector<double> vec; typedef vector<vec> mat; //Ax = b vec gauss_jordan(const mat &A, const vec &b) { int n = A.size(); mat B(n,vec(n+1)); //定义大小 for(int i=0;i < n;i++) for(int j=0;j < n;j++) B[i][j] = A[i][j]; for(int i=0;i < n;i++) B[i][n] = b[i]; //把 b 放在 B 的右边一起运算 for(int i=0;i < n;i++) //把正在处理的未知数系数的绝对值最大的式子换到第i行(为什么是第i行) { int pivot = i; for(int j=i;j < n;j++) if(abs(B[j][i]) > abs(B[pivot][i])) pivot = j; swap(B[pivot],B[i]); if(abs(B[i][i]) < EPS) return vec(); //这种情况下,无解或者是无穷多解。 for(int j=i+1;j <= n;j++) B[i][j] = B[i][j]/B[i][i]; //把正在处理的未知数的系数变为1。 for(int j=0;j < n;j++) { if(i != j) for(int k=i+1;k <= n;k++) B[j][k] -= B[j][i]*B[i][k]; //消参 } } vec x(n); for(int i=0;i < n;i++) x[i] = B[i][n]; return x; }
先了解一下,以后拿例题练。