To find the inverse of the matrix if it exists by elementary row operations
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
int main()
{
double *coeff[15],*I[15],temp,temp1,str,str1;
int i,j,ROW,k,nz,p,q;
printf("\n Enter the value of row OR coloumn:");
scanf("%d",&ROW);
for(i=0;i<ROW;i++)
{
coeff[i]=(double *)malloc(ROW*sizeof(double));
I[i]=(double *)malloc(ROW*sizeof(double));
}
printf("\n Enter the elements of the matrix(A)");
for(i=0;i<ROW;i++)
{
for(j=0;j<ROW;j++)
scanf("%lf",(coeff[i]+j));
}
for(i=0;i<ROW;i++)
{
for(j=0;j<ROW;j++)
{
if(i==j)
I[i][j]=1.0;
else
I[i][j]=0.0;
}
}
printf("\n The Matrix A is:\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<ROW;j++)
{
printf("%lf ",*(coeff[i]+j));
}
printf("\n");
}
for(i=0;i<ROW-1;i++)
{
nz=i;
if(*(coeff[i]+i)==0.0)
{
do
{
nz++;
if(nz>=ROW)
{
printf("\n Not invertible:\n");
exit(1);
}
}while(*(coeff[nz]+i)==0.0);
//printf("\nnz=%d",nz);
for(k=0;k<ROW;k++)
{
temp=*(coeff[nz]+k); temp1=*(I[nz]+k);
*(coeff[nz]+k)=*(coeff[i]+k); *(I[nz]+k)=*(I[i]+k);
*(coeff[i]+k)=temp; *(I[i]+k)=temp1;
}
}
/* printf("\n \n The Augumented (A|b) matrix after Row operations is:\n");
for(p=0;p<ROW;p++)
{
for(q=0;q<ROW;q++)
printf("%lf ",*(coeff[p]+q));
printf("\n");
}*/
for(k=0;k<ROW-i-1;k++)
{
temp=0.0;
temp1=0.0;
str=coeff[i+1+k][i];
//printf("\n str=%lf",str);
//printf("\n pivot=%lf",coeff[i][i]);
for(j=0;j<ROW;j++)
{
temp=coeff[i+k+1][j]; temp1=I[i+k+1][j];
//printf(" temp=%lf ",temp);
if(str==0.0)
continue;
//temp=temp-((str/coeff[i][i])*coeff[i][j]); temp1=temp1-((str/coeff[i][i])*I[i][j]);
temp=temp/str; temp1=temp1/str;
//temp=temp-((temp/str)*coeff[i][i]); temp1=temp1-((str/coeff[i][i])*I[i][j]);
temp=temp*coeff[i][i]; temp1=temp1*coeff[i][i];
temp=temp-coeff[i][j]; temp1=temp1-I[i][j];
//printf(" [temp=%lf] ",temp);
coeff[i+k+1][j]=temp; I[i+k+1][j]=temp1;
}
}
}
/*printf("\n \n The Augumented (A|b) matrix after Row operations is:\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<ROW;j++)
printf("%lf ",*(coeff[i]+j));
printf("\n");
}
printf("\n \n The Inverse of the matrix is:\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<ROW;j++)
printf("%lf ",*(I[i]+j));
printf("\n");
}*/
for(i=ROW-1;i>0;i--)
{
temp=0.0;
temp1=0.0;
for(k=i-1;k>=0;k--)
{
str=coeff[k][i];
//printf("\n str1=%lf",str1);
//printf("\n str=%lf\n",str);
for(j=0;j<ROW;j++)
{
if(str==0.0)
continue;
temp=coeff[k][j]/str; temp1=I[k][j]/str;
//printf(" temp1=%lf",temp1);
temp= temp*coeff[i][i]; temp1=temp1*coeff[i][i];
//printf("\n temp=%lf",temp);
temp=temp-coeff[i][j]; temp1=temp1-I[i][j];
coeff[k][j]=temp; I[k][j]=temp1;
}
}
}
/*printf("\n \n The Augumented (A|b) matrix after Row operations is:\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<ROW;j++)
{
//if(i==j)
// printf("%lf ",*(coeff[i]+j)/coeff[i][i]);
//else
printf("%lf ",*(coeff[i]+j));
}
printf("\n");
}*/
printf("\n \n The Inverse of the matrix is:\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<ROW;j++)
{
if(coeff[i][i]==0.0)
printf("%lf ",*(I[i]+j));
else
printf("%lf ",*(I[i]+j)/coeff[i][i]);
}
printf("\n");
}
return 0;
}
No comments:
Post a Comment