// Gauss Elimination routine // modified version based on: // // gauselim.cpp : Gaussian Elimination / Backward Substitution / FULL Pivoting // by Kenny Hoff : 2/6/97 : VERSION 4 // http://www.cs.unc.edu/~hoff/projects/comp205/proj3/gauselim/gauseli4.cpp #include "Error.h" #define ABS(x) ((x) >= 0 ? (x) : (-(x))) void GaussElimFullPivot(double M[8][9], int n, int m, double* X) { int k,i,j,iPivot,jPivot; double SwapColTmp, SwapRowTmp, NullFactor; // REQUIRES A EXTRA STORAGE TO RECORD COLUMN SWAPS (FULL PIVOTING SWAPS // BOTH ROWS AND COLUMNS SINCE THE PIVOT ELEMENT IS CHOSEN FROM THE ENTIRE // SUBMATRIX, RATHER THAN JUST THE COL AS IN PARTIAL PIVOTING). // EACH ELT j IN SWAP STORES THE NEW LOCATION OF THE jth COLUMN. int *Swap = new int[n]; // DOES NOT INCLUDE LAST COLUMN for (j=0; j ABS(M[iPivot][jPivot])) { iPivot=i; jPivot=j; } } } // IF THERE IS NO NONZERO ELEMENT AS A PIVOT, QUIT! if (M[iPivot][jPivot] == 0) throw CError("GaussElim: singular matrix!"); // SWAP THE PIVOT ROW WITH THE KTH ROW for (j=0; j=0; k--) // FOR EACH ROW STARTING AT THE BOTTOM { X[k] = M[k][m-1]; // SOLVE FOR CURRENT X[k] for (j=(k+1); j<(m-1); j++) X[k] -= (M[k][j]*X[j]); X[k] /= M[k][k]; } // MUST REARRANGE THE SOLUTION VECTOR X BASED ON SWAP ARRAY double *Xcopy = new double[n]; for (i=0; i