有點線代的知識:
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; }
先了解一下,以后拿例題練。