# Help with output

This is a discussion on Help with output within the C Programming forums, part of the General Programming Boards category; Have the following Gauss Elim code from text: Not printing out correct code: SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS USING GAUSSIAN ...

1. ## Help with output

Have the following Gauss Elim code from text:

Not printing out correct code:

SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS
USING GAUSSIAN ELIMINATION

This program uses Gaussian Elimination to solve the
system Ax = B, where A is the matrix of known
coefficients, B is the vector of known constants
and x is the column matrix of the unknowns.
Number of equations: 3

Enter elements of matrix [A]
A(1,1) = 0
A(1,2) = -6
A(1,3) = 9
A(2,1) = 7
A(2,2) = 0
A(2,3) = -5
A(3,1) = 5
A(3,2) = -8
A(3,3) = 6

Enter elements of [B] vector
B(1) = -3
B(2) = 3
B(3) = -4

SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS

The solution is
x(1) = 0.000000
x(2) = -1.#IND00
x(3) = -1.#IND00
Determinant = -1.#IND00
Press any key to continue . . .

Should be 1.058824, 1.823529, 0.882353, det= -102.0000

Any suggestions?- I tried to check- need fresh set of eyes

Code:
//Modified Code from C Numerical Methods Text

#include <stdio.h>
#include <math.h>
#define MAXSIZE 20

//function prototype
int gauss (double a[][MAXSIZE], double b[], int n, double *det);

int main(void)
{
double a[MAXSIZE][MAXSIZE], b[MAXSIZE], det;
int i, j, n, retval;

printf("\n \t SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS");
printf("\n \t USING GAUSSIAN ELIMINATION \n");
printf("\n This program uses Gaussian Elimination to solve the");
printf("\n system Ax = B, where A is the matrix of known");
printf("\n coefficients, B is the vector of known constants");
printf("\n and x is the column matrix of the unknowns.");

//get number of equations
n = 0;
while(n <= 0 || n > MAXSIZE)
{
printf("\n Number of equations: ");
scanf ("%d", &n);
}

printf("\n Enter elements of matrix [A]\n");
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
printf(" A(%d,%d) = ", i + 1, j + 1);
scanf("%lf", &a[i][j]);
}
printf("\n Enter elements of [B] vector\n");
for (i = 0; i < n; i++)
{
printf(" B(%d) = ", i + 1);
scanf("%lf", &b[i]);
}

//call Gauss elimination function
retval = gauss(a, b, n, &det);

//print results
if (retval == 0)
{
printf("\n\t SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS\n");
printf("\n\t The solution is");
for (i = 0; i < n; i++)
printf("\n \t x(%d) = %lf", i + 1, b[i]);
printf("\n \t Determinant = %lf \n", det);
}
else
printf("\n \t SINGULAR MATRIX \n");

return 0;
}

/* Solves the system of equations [A]{x} = {B} using       */
/* the Gaussian elimination method with partial pivoting.  */
/* Parameters:                                             */
/*      n         - number of equations                    */
/*      a[n][n]   - coefficient matrix                     */
/*      b[n]      - right-hand side vector                 */
/*      *det      - determinant of [A]                     */

int gauss (double a[][MAXSIZE], double b[], int n, double *det)
{
double tol, temp, mult;
int npivot, i, j, l, k, flag;

//initialization
*det = 1.0;
tol = 1e-30;        //initial tolerance value
npivot = 0;

//forward elimination
for (k = 0; k < n; k++)
{
//search for max coefficient in pivot row- a[k][k] pivot element
for (i = k; i < n; i++)
{
if (fabs(a[i][k]) > fabs(a[k][k]))
{
//interchange row with maxium element with pivot row
npivot++;
for (l = 0; l < n; l++)
{
temp = a[i][l];
a[i][l] = a[k][l];
a[k][l] = temp;
}
temp = b[i];
b[i] = b[k];
b[k] = temp;
}
}
//test for singularity
if (fabs(a[k][k]) < tol)
{
//matrix is singular- terminate
flag = 1;
return flag;
}
//compute determinant- the product of the pivot elements
*det = *det * a[k][k];

//eliminate the coefficients of X(I)
for (i = k; i < n; i++)
{
mult = a[i][k] / a[k][k];
b[i] = b[i] - b[k] * mult;  //compute constants
for (j = k; j < n; j++)     //compute coefficients
a[i][j] = a[i][j] - a[k][j] * mult;
}
}
//adjust the sign of the determinant
if(npivot % 2 == 1)
*det = *det * (-1.0);

//backsubstitution
b[n] = b[n] / a[n][n];
for(i = n - 1; i > 1; i--)
{
for(j = n; j > i + 1; j--)
b[i] = b[i] - a[i][j] * b[j];
b[i] = b[i] / a[i - 1][i];
}
flag = 0;
return flag;
}

2. I'm thinking you should find the largest value in a given column first, then swap that with to the correct position -- as it is you're doing who knows how many swaps, which can affect the sign of your determinant. (I don't see how that fixes the problem, so there's bound to be something else as well.)

3. Your eliminate coefficients loop starts one row too early -- you always wipe out the row you're trying to keep before starting, meaning that every other entry becomes x/0.

4. Code:
//eliminate the coefficients of X(I)
for (i = k + 1; i < n; i++)
{
mult = a[i][k] / a[k][k];
b[i] = b[i] - b[k] * mult;  //compute constants
for (j = k; j < n; j++)     //compute coefficients
a[i][j] = a[i][j] - a[k][j] * mult;
}
}

SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS
USING GAUSSIAN ELIMINATION

This program uses Gaussian Elimination to solve the
system Ax = B, where A is the matrix of known
coefficients, B is the vector of known constants
and x is the column matrix of the unknowns.
Number of equations: 3

Enter elements of matrix [A]
A(1,1) = 0
A(1,2) = -6
A(1,3) = 9
A(2,1) = 7
A(2,2) = 0
A(2,3) = -5
A(3,1) = 5
A(3,2) = -8
A(3,3) = 6

Enter elements of [B] vector
B(1) = -3
B(2) = 3
B(3) = -4

SOLUTION OF SIMULTANEOUS LINEAR EQUATIONS

The solution is
x(1) = 3.000000
x(2) = -6.142857
x(3) = 0.167910
Determinant = -102.000000
Press any key to continue . . .

The determinate is correct now- but the solution does not match the one got be hand which is correct...what else needs to be changed elsewhere...I have tried...

5. I suppose your backsubstitution starts in the wrong place as well. (There is no such thing as row n in a nxn matrix in C.)