//this is the program for gaussian elimination method for solving system of equations
#include<stdio.h> //preprocessor library used in the program
//prototypes
void starter(); //this function displays the start of the program
void getvalues(int R,int C,float A[][C+1]);//this function get values of augmented values
void printmatrix(int R,int C,float A[][C+1]); //function will print the matrix
void Swap(int R,int C,float A[][C+1]); //function will swap the rows of the matrix
float Echelon(int R1,int C1,float A1[][C1+1]);//function will convert matrix in echelon form
float Infinite(int R2,int C2,float A2[][C2+1],float X1[]); //function for infinite sol. case
float Unique(int R3,int C3, float A3[][C3+1],float X2[]); //function for no sol. case
void solution(int R,int C,float A[][C+1],float X[]); //function shows the solution result
void endresult(); //function which ends the program
int main() //main function starts here
{
starter(); //call to starter function
int i,j,R,C; //declaration of variables used in main
//now it will take user input for how many unknown variables of each equation
printf("\n\tEnter Number of unknown variables.\n\t"); //ask the user
scanf(" %d",&R); //get the value from user
C=R; //no.of unknown vaariables is always equal to no of equations
float A[R][C+1]; //declaration of array which contains the augmented matrix
float X[10]={0}; //declaring array which contains row to swap
getvalues(R,C,A); //call for getting the input for augmented matrix
printf("\tThe augmented matrix of the system of equations is\n");
printmatrix(R,C,A); //call to show the matrix before echelon form
Swap(R,C,A); //call to check the matrix for any zero value and then swap
Echelon(R,C,A); //call for converting in echelon form
printf("\tAfter reducing the matrix in echelon form\n");
printmatrix(R,C,A); //print the matrix after echelon form
solution(R,C,A,X); //call to display the final result
endresult(); //call to end the program
return 0; //ensures program ends
}
//main bloack ends
//function for starting page starts here
void starter()//definition of the funtion starter of void type
{
//the very first welcoming screen display
printf("\n_______________________________________________________________");
printf("\n!! ****************** ASSLAM U ALAIKUM ****************** !!");
printf("\n!! \t \t!!");
printf("\n!! \t \t!!");
printf("\n!! \t WELCOME TO THE WORLD OF LINEAR EQUATIONS \t!!");
printf("\n!! \t YOU CAN SOLVE ANY KIND OF EQUATION USING \t!!");
printf("\n!! \t \t!!");
printf("\n!! \t \tGAUSSIAN ELIMINATION METHOD \t\t!!");
printf("\n!! \t \t!!");
printf("\n!! \t \t!!");
printf("\n!!______________________________________________________________!!\n");
printf("\n!! ----------------GENERAL INSTRUCTION------------------- !!");
printf("\n!! 1)Number of equations and variables should be equal. !!");
printf("\n!! 2)Gaussian method is applicable for square matrices. !!");
printf("\n!! 3)Equations in the form of matrix are as AX=B \t!!\n!!\t where\t\t\t\t\t\t\t!!\n!!\t A is the matrix of coefficients.\t\t\t!!");
printf("\n!! B is matrix for constants.\t\t\t\t!!");
printf("\n!! X is the unknown matrix which contains variables. !!");
printf("\n!!______________________________________________________________!!\n");
//general instructions for the user are also included so that he could understand
// what he is doing
}
//starter function ends here
//definition of getvalues function starts here
//it will get the co efficient of the variables and adjust them in an array
void getvalues(int R,int C,float A[][C+1])
{
int i,j; //declare i for row check and j for colomn check
printf("\n\tEnter coefficients which are the elements of matrix A\n");
int equno=0; //asking user for input and equno is used to checkfor no of equation
for (i=0; i<R; i++) //this for loop will move through each row
{
equno++; //increment in variable
printf("\tequation %d \n",equno); //show equation no.whose values are entered
for (j=0;j<C; j++) //for loop will move through each coloumn
{
printf("\t A[%d][%d] ",i+1,j+1);
scanf("%f",&A[i][j]); //takes user input and adjust in the array
}
printf("\n"); //switch lines
}
printf("\tEnter Elements Of Matix B\n"); //asks for values in constant matrix
for (i=0; i<R; i++) //loop for rows
{
for (j=C; j<C+1; j++) //loop for coloumn
{
printf("\t B[%d][%d] ",i+1,j+1);
scanf("%f",&A[i][j]); //takes input and adjust in last colomn of array
}
printf("\n"); // switch lines
}
}//getvalues function ends here
//function for printing matrix
//printing the values of the array in augmented matrix
void printmatrix(int R,int C,float A[][C+1])
{
int i,j; //declare i for row check and j for colomn check
for (i=0; i<R; i++) //this for loop will move through each row
{
for (j=0; j<C+1; j++) //loop for coloumn
{
if(j!=C) //print the values of matrix A
{printf("\t%.1f ",A[i][j]);}
if(j==C) //prints the vaalues of matrix B
{printf("|\t%.1f ",A[i][j]);}
}
printf("\n");//switch lines
}
printf("\n\n");//switch lines
}//printmatrix funcion ends here
//function for swapping rows
//this swap rows if there is zero in the diagonal
void Swap(int R,int C,float A[][C+1])
{
int i,j,Counter1,Counter2,Counter3,Temp2,red=0; //declaration variables
float Temp[C+1]; //declare an array for swaping assistance
for (i=0; i<R; i++) //loop for rows
{
for (j=0; j<C+1; j++) //loop for coloumn
{ if (i==j) //checks only for element in diagonal
{ if (A[i][i]==0) //check for 0 in diagonal
{ for (Counter3=0; Counter3<R; Counter3++)
{ if (A[Counter3][j]!=0)
{
Temp2=Counter3;
}
}
{
for (Counter2=0; Counter2<C+1; Counter2++)
{ //this will swap the rows
Temp[Counter2]=A[i][Counter2];
A[i][Counter2]=A[Temp2][Counter2];
A[Temp2][Counter2]=Temp[Counter2];
}
}
}
}
}
}
}//swap function will end here
//echelon funcion starts here
//it will convert matrix in upper trangular form
float Echelon(int R1,int C1,float A1[][C1+1])
{
int i,j,Pass1,Pass2,Pass3,K3; //declaration variables
//K3 for storing divisor //all pass1,2,3 for sorting assistance
Pass2=0; // initialization of variables
for (j=0; j<C1; j++) //loop for rows
{
Pass2++; //increment
K3=1; //initalize divisor at 1
for (i=Pass2; i<R1+1; i++) //loop for coloumn
{
if (j==i-1) //
{
float K1=A1[i-1][j]; //stores value for division
for (Pass1=0; Pass1<C1+1; Pass1++) //check for rows
{
if (i==R1 && A1[R1-1][C1-1]==0 && A1[R1-1][C1]!=0)
{
break;
}
if (i==R1 && A1[R1-1][C1-1]==0 && A1[R1-1][C1]==0)
{
break;
}
A1[j][Pass1]=A1[j][Pass1]/K1;
}
}
if (i==R1)
{
break;
}
float K2=A1[i][j];
for (Pass3=0; Pass3<C1+1; Pass3++)
{
A1[i][Pass3]=A1[i][Pass3]-(K2*A1[i-K3][Pass3]);
}
K3++;
}
}
} //echelon function ends
// infinite function starts
//function willoperate for infinte solutions
float Infinite(int R2,int C2,float A2[][C2+1],float X1[])
{
int i,j,Pass6,Pass7;
Pass6=0;
for (i=0; i<(R2-1); i++)
{
Pass6++;
if (Pass6>1)
{
for (j=1; j<Pass6; j++)
{
int Pass7;
Pass7=A2[R2-(i+2)][C2-1];
X1[i]=X1[i]-Pass7-X1[i-1]*A2[R2-(i+2)][C2-(j+1)];
if(j==1)
{
Pass7=0;
}
}
}
else
{
X1[i]=-A2[R2-2][C2-1];
}
}
}//infinite function ends here
//function for unique solution
//back substitution of unique answers held here
float Unique(int R3,int C3, float A3[][C3+1],float X2[])
{
int i,j,Pass4,Pass5; //declaration variables
Pass4=0;
for (i=0; i<R3; i++) //loop for rows
{
Pass4++;
if (Pass4>1)
{
for (j=1; j<Pass4; j++) //loop for coloumn
{
X2[i]=X2[i]+A3[R3-(i+1)][C3] -X2[j-1]*A3[R3-(i+1)][C3-j];
if (j==1)
{
A3[R3-(i+1)][C3]=0;
}
}
}
else
{
X2[i]=A3[R3-1][C3];
}
}
} //unique function ends here
//function for displaying answrs starts
//will show the respective solution of the matrices
void solution(int R,int C,float A[][C+1],float X[])
{
int i,j; //declare i for row check and j for colomn check
printf("\n\t******HERE IS THE ANSWER******\t\n");
if (A[R-1][C-1]==0 && A[R-1][C]!=0) //condition for no solution
{
printf("\n\n\t The given system of equation has no solution\n");
}
if (A[R-1][C-1]==0 && A[R-1][C]==0) //condition for infinite solution
{
Infinite(C,R,A,X); //calls infinite function
printf("\n\tThe given system of equation has Infinite Solutions\n\t");
for (i=0; i<(R-1); i++) //loop for rows
{
printf("\tX[%d] = %.2ft\n",i+1,X[R-(i+2)]);
} //displays the result of infinite answer
printf("\tX[%d] = t\n",R);
printf("\tWhere -Infinity < t < +Infinity\n");
}
if (A[R-1][C-1]!=0)// condition for unique solution
{
Unique(R,C,A,X);//calls for unique function
printf("\tEach unknown variable has unique solution\n");
for (i=0; i<R; i++) //loop for rows
{
printf("\t\tX[%d] = %.2f \n",1+i,X[R-i-1]);
} //display result for unique solutions
}
} // solution function ends here
//this will display the good bye screen
//and will show the group members
void endresult()
{
printf("\n\n\t**************THANK YOU FOR USING THIS PROGRAM*****************");
}//function end result will end here
//the program will end
i really appreciate this type of systems of equation solver which can be easily designed in "C" Language.....
ReplyDeleteI am also searching and want help in the coding part of development of simplifying radical expressions calculator which will be available online .Please give some suggestions .
ReplyDeleteIn the swap function, is it possible to enter this block of code without Temp2 being initialized?
ReplyDeletefor (Counter2=0; Counter2<C+1; Counter2++)
{ //this will swap the rows
Temp[Counter2]=A[i][Counter2];
A[i][Counter2]=A[Temp2][Counter2];
A[Temp2][Counter2]=Temp[Counter2];
}