#include #include void gauss(double lin[][12],int n) { double x[11], // solution matrix temp, // temporary storage to exchange rows in matrix epsil=1.e-6, // check criteria mult, // multiplier used to elimnate values abspiv; // absolute value of pivot element int i,j,k, // indices pivrow, // row containing pivot element singul=0; // singular matrix indicator for (i=1 ; i<=n ; ++i) { // Locate the optimal pivot element abspiv = fabs(lin[i][i]); pivrow = i; for (k=(i+1) ; k<=n ; ++k) { if (fabs(lin[k][i]) > abspiv) { abspiv = fabs(lin[k][i]); pivrow = k; } } // Check if matrix is nearly singular if (abspiv < epsil) { singul = 1; printf("Problems with singular matrix.\n"); break; } // Interchange rows if necessary if (pivrow != i) { for (j=1 ; j<=(n+1) ; ++j) { temp = lin[i][j]; lin[i][j] = lin[pivrow][j]; lin[pivrow][j] = temp; } } // Eliminate coefficients below for (j=(i+1) ; j<=n ; ++j) { mult = -lin[j][i]/lin[i][i]; for (k=i ; k<=(n+1) ; ++k) lin[j][k] = lin[j][k] + mult * lin[i][k]; } } // Find the solution by back substitution x[n] = lin[n][n+1]/lin[n][n]; for (j=(n-1) ; j>=1 ; --j) { x[j] = lin[j][n+1]; for (k=(j+1) ; k<=n ; ++k) x[j] = x[j] - lin[j][k] * x[k]; x[j] = x[j] / lin[j][j]; } // Print out solution or if singular if (singul == 1) printf("Singular matrix problem. No solution.\n"); else for (i=1 ; i<=n ; ++i) printf("Unknown #%d is...> %lf\n",i,x[i]); return; }