#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void diamorfosipinakon(float **a,float *b,float b_h,float **m,int n,float s);
void gauss(float **a,float *b,float **m,float *x,int n);
void gjordan(float **a,float **a1,float *b,float **m,float *x,int n);
void sor(float **a,float *b,float *x0,float *x1,int n,float w);
void esor(float **a,float *b,float *x0,float *x1,int n,float w);
void cgauss(float **a,float *b,float **m,float *x,float *c,int n);
void cgjordan(float **a,float **a1,float *b,float **m,float *x,float *c,int n);
void csor(float **a,float *b,float *x0,float *x1,float *c,int n,float w);
int main(void)
{
int epilogi;
float s,b_h,*b,**m,*x,**a,**a1,*x0,*x1,w,*c;
int n,i,j;
char xar;
xar='n';
while(xar=='n')
{
printf("\n======================ASKHSH 2============================");
printf("\nPATHSTE :");
printf("\n1.METHODOS GAUSS");
printf("\n2.METHODOS GAUSS-JORDAN");
printf("\n3.METHODOS SOR");
printf("\n4.METHODOS GAUSS GIA n=10(10)100 ");
printf("\n5.METHODOS GAUSS-JORDAN GIA n=10(10)100");
printf("\n6.METHODOS SOR GIA n=10(10)100");
printf("\n7.BELTISTH TIMH W GIA n=10(10)100\n");
scanf("\n%d",&epilogi);
switch(epilogi)
{
case 1:
s=b_h=i=j=0;
printf("dose to megethos toy pinaka:");
scanf("%d",&n);
b=(float*)malloc(n*sizeof(float));
x=(float*)malloc(n*sizeof(float));
a=(float**)malloc(n*sizeof(float));
a1=(float**)malloc(n*sizeof(float));
m=(float**)malloc(n*sizeof(float));
x0=(float*)malloc(n*sizeof(float));
x1=(float*)malloc(n*sizeof(float));
for(i=0;i<n;i++)
{
a[i]=(float*)malloc((n+1)*sizeof(float));
a1[i]=(float*)malloc((n+1)*sizeof(float));
m[i]=(float*)malloc(n*sizeof(float));
}
for(s=0.1;s<1;s=s+0.1)
{
b_h=1+(n-1)*s;
printf("H timh tou s einai : s=%f\n",s);
printf("H timh tou b einai : b=%f\n",b_h);
diamorfosipinakon(a,b,b_h,m,n,s);
getchar();
gauss(a,b,m,x,n);
getchar();
}
break;
case 2:
s=b_h=i=j=0;
printf("dose to megethos toy pinaka:");
scanf("%d",&n);
b=(float*)malloc(n*sizeof(float));
x=(float*)malloc(n*sizeof(float));
a=(float**)malloc(n*sizeof(float));
a1=(float**)malloc(n*sizeof(float));
m=(float**)malloc(n*sizeof(float));
x0=(float*)malloc(n*sizeof(float));
x1=(float*)malloc(n*sizeof(float));
for(i=0;i<n;i++)
{
a[i]=(float*)malloc((n+1)*sizeof(float));
a1[i]=(float*)malloc((n+1)*sizeof(float));
m[i]=(float*)malloc(n*sizeof(float));
}
for(s=0.1;s<1;s=s+0.1)
{
b_h=1+(n-1)*s;
printf("H timh tou s einai : s=%f\n",s);
printf("H timh tou b einai : b=%f\n",b_h);
diamorfosipinakon(a,b,b_h,m,n,s);
getchar();
gjordan(a,a1,b,m,x,n);
getchar();
}
break;
case 3:
s=b_h=i=j=0;
printf("dose to megethos toy pinaka:");
scanf("%d",&n);
b=(float*)malloc(n*sizeof(float));
x=(float*)malloc(n*sizeof(float));
a=(float**)malloc(n*sizeof(float));
a1=(float**)malloc(n*sizeof(float));
m=(float**)malloc(n*sizeof(float));
x0=(float*)malloc(n*sizeof(float));
x1=(float*)malloc(n*sizeof(float));
for(i=0;i<n;i++)
{
a[i]=(float*)malloc((n+1)*sizeof(float));
a1[i]=(float*)malloc((n+1)*sizeof(float));
m[i]=(float*)malloc(n*sizeof(float));
}
for(s=0.1;s<1;s=s+0.1)
{
b_h=1+(n-1)*s;
printf("H timh tou s einai : s=%f\n",s);
printf("H timh tou b einai : b=%f\n",b_h);
for(w=0.1;w<1;w=w+0.1)
{
diamorfosipinakon(a,b,b_h,m,n,s);
printf("GIA w=%f EXOYME TIS PARAKATO LYSEIS ME THN E.M.SOR:\n(kai oi epanalhjeis einai =itcount)\n",w);
sor(a,b,x0,x1,n,w);
getchar();
}
getchar();
}
break;
case 4:
s=b_h=i=j=0;
for(n=10;n<=100;n=n+10)
{
b=(float*)malloc(n*sizeof(float));
x=(float*)malloc(n*sizeof(float));
a=(float**)malloc(n*sizeof(float));
a1=(float**)malloc(n*sizeof(float));
m=(float**)malloc(n*sizeof(float));
x0=(float*)malloc(n*sizeof(float));
x1=(float*)malloc(n*sizeof(float));
c=(float*)malloc(n*sizeof(float));
for(i=0;i<n;i++)
{
a[i]=(float*)malloc((n+1)*sizeof(float));
a1[i]=(float*)malloc((n+1)*sizeof(float));
m[i]=(float*)malloc(n*sizeof(float));
}
for(s=0.1;s<1;s=s+0.1)
{
b_h=1+(n-1)*s;
printf("H timh tou s einai : s=%f\n",s);
printf("H timh tou b einai : b=%f\n",b_h);
diamorfosipinakon(a,b,b_h,m,n,s);
getchar();
gauss(a,b,m,x,n);
diamorfosipinakon(a,b,b_h,m,n,s);
cgauss(a,b,m,x,c,n);
getchar();
}
}
break;
case 5:
s=b_h=i=j=0;
for(n=10;n<=100;n=n+10)
{
b=(float*)malloc(n*sizeof(float));
x=(float*)malloc(n*sizeof(float));
a=(float**)malloc(n*sizeof(float));
a1=(float**)malloc(n*sizeof(float));
m=(float**)malloc(n*sizeof(float));
x0=(float*)malloc(n*sizeof(float));
x1=(float*)malloc(n*sizeof(float));
c=(float*)malloc(n*sizeof(float));
for(i=0;i<n;i++)
{
a[i]=(float*)malloc((n+1)*sizeof(float));
a1[i]=(float*)malloc((n+1)*sizeof(float));
m[i]=(float*)malloc(n*sizeof(float));
}
for(s=0.1;s<1;s=s+0.1)
{
b_h=1+(n-1)*s;
printf("H timh tou s einai : s=%f\n",s);
printf("H timh tou b einai : b=%f\n",b_h);
diamorfosipinakon(a,b,b_h,m,n,s);
getchar();
gjordan(a,a1,b,m,x,n);
diamorfosipinakon(a,b,b_h,m,n,s);
cgjordan(a,a1,b,m,x,c,n);
getchar();
}
}
break;
case 6:
s=b_h=i=j=0;
for(n=10;n<=100;n=n+10)
{
b=(float*)malloc(n*sizeof(float));
x=(float*)malloc(n*sizeof(float));
a=(float**)malloc(n*sizeof(float));
a1=(float**)malloc(n*sizeof(float));
m=(float**)malloc(n*sizeof(float));
x0=(float*)malloc(n*sizeof(float));
x1=(float*)malloc(n*sizeof(float));
c=(float*)malloc(n*sizeof(float));
for(i=0;i<n;i++)
{
a[i]=(float*)malloc((n+1)*sizeof(float));
a1[i]=(float*)malloc((n+1)*sizeof(float));
m[i]=(float*)malloc(n*sizeof(float));
}
for(s=0.1;s<1;s=s+0.1)
{
b_h=1+(n-1)*s;
printf("H timh tou s einai : s=%f\n",s);
printf("H timh tou b einai : b=%f\n",b_h);
for(w=0.1;w<1;w=w+0.1)
{
diamorfosipinakon(a,b,b_h,m,n,s);
printf("GIA w=%f EXOYME TIS PARAKATO LYSEIS ME THN E.M.SOR:\n(kai oi epanalhjeis einai =itcount)\n",w);
sor(a,b,x0,x1,n,w);
diamorfosipinakon(a,b,b_h,m,n,s);
csor(a,b,x0,x1,c,n,w);
getchar();
}
getchar();
}
}
break;
case 7:
s=b_h=i=j=n=0;
for(n=10;n<=100;n=n+10)
{
b=(float*)malloc(n*sizeof(float));
x=(float*)malloc(n*sizeof(float));
a=(float**)malloc(n*sizeof(float));
a1=(float**)malloc(n*sizeof(float));
m=(float**)malloc(n*sizeof(float));
x0=(float*)malloc(n*sizeof(float));
x1=(float*)malloc(n*sizeof(float));
for(i=0;i<n;i++)
{
a[i]=(float*)malloc((n+1)*sizeof(float));
a1[i]=(float*)malloc((n+1)*sizeof(float));
m[i]=(float*)malloc(n*sizeof(float));
}
for(s=0.1;s<1;s=s+0.1)
{
b_h=1+(n-1)*s;
//printf("H timh tou s einai : s=%f\n",s);
//printf("H timh tou b einai : b=%f\n",b_h);
getchar();
for(w=0.1;w<1;w=w+0.1)
{
diamorfosipinakon(a,b,b_h,m,n,s);
printf("\nGIA n=%d s=%f w=%f epanalijeis=",n,s,w);
esor(a,b,x0,x1,n,w);
}
getchar();
}
}
break;
default:
printf("O arithmos den brisketai metaji 1 kai 7");
break;
}
printf("\nGia synexeia patiste n(ai) diaforetika o(xi):");
scanf("\n%c",&xar);
getchar();
}
return 0;
}
void gauss(float **a,float *b,float **m,float *x,int n)
{
int i,j,r,q;
float h=0;
i=j=r=q=0;
for(i=0;i<n;i++)
{
a[i][n]=b[i];
}
for(r=0;r<n-1;r++)
{
if(a[r][r]<a[r+1][r])
{
for(q=0;q<n-1;q++)
{
b[q]=a[0][q];
a[0][q]=a[1][q];
a[1][q]=b[q];
}
}
for(i=r+1;i<n;i++)
{
m[i][r]=-(a[i][r]/a[r][r]);
for(j=r;j<n+1;j++)
{
a[i][j]=a[i][j]+m[i][r]*a[r][j];
}
}
}
if(a[n-1][n-1]==0)
{
printf("DEN YPARXEI MONADIKH LYSH");
exit(-1);
}
x[n-1]=a[n-1][n]/a[n-1][n-1];
for(i=n-2;i>=0;i--)
{
h=0;
for(j=i+1;j<=n-1;j++)
{
h=h+(a[i][j]*x[j]);
}
x[i]=((a[i][n]-(h))/a[i][i]);
}
for(i=0;i<n;i++)
{
printf("x[%d]=%f\n",i,x[i]);
}
}
void gjordan(float **a,float **a1,float *b,float **m,float *x,int n)
{
int i,j,r,q;
float *m1;
m1=(float*)malloc(n*sizeof(float));
i=j=r=q=0;
for(i=0;i<n;i++)
{
m1[i]=0;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
{
a1[i][j]=1;
}
else
{
a1[i][j]=0;
}
}
}
for(r=0;r<n-1;r++)
{
if(a[r][r]<a[r+1][r])
{
for(q=0;q<n-1;q++)
{
b[q]=a[0][q];
a[0][q]=a[1][q];
a[1][q]=b[q];
}
}
for(i=r+1;i<n;i++)
{
m[i][r]=-(a[i][r]/a[r][r]);
for(j=r;j<n;j++)
{
a[i][j]=a[i][j]+m[i][r]*a[r][j];
a1[i][j]=a1[i][j]+m[i][r]*a1[r][j];
}
}
}
i=j=r=q=0;
for(r=n-1;r>0;r--)
{
for(i=r-1;i>=0;i--)
{
m[i][r]=-(a[i][r]/a[r][r]);
for(j=r;j>=0;j--)
{
a[i][j]=a[i][j]+m[i][r]*a[r][j];
a1[i][j]=a1[i][j]+m[i][r]*a1[r][j];
}
}
}
for(i=0;i<n;i++)
{ // Sti synexeia ejisonei ta stoixeia tis
m1[i]=1/a[i][i]; // kyrias diagonioy me to 1 me ti
// boithia tou pollaplasisti m1.
for(j=0;j<n;j++)
{
a[i][j]=a[i][j]*m1[i];
a1[i][j]=a1[i][j]*m1[i];
}
}
/* for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("a[%d][%d]=%f",i,j,a[i][j]);
}
printf("\n");
}*/
printf("O ANTISTROFOS TOU A EINAI:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("a1[%d][%d]=%f",i,j,a1[i][j]);
}
printf("\n");
}
for(i=0;i<n;i++)
{
x[i]=0;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
x[i]+=a1[i][j]*b[j]; // Telos ypologizoume tin lusi x apo tin x=a1*b.
}
}
for(i=0;i<n;i++)
{
printf("x[%d]=%f\n",i,x[i]);
}
}
void diamorfosipinakon(float **a,float *b,float b_h,float **m,int n,float s)
{
int i,j;
i=j=0;
for(i=0;i<n;i++)
{
b[i]=b_h;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
{
a[i][j]=1;
}
else
{
a[i][j]=s;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
m[i][j]=0;
}
}
}
void sor(float **a,float *b,float *x0,float *x1,int n,float w)
{
/*H synartisi sor xrisimopoiei tin E.M. SOR gia ton pinaka A.*/
float sum1[1000],sum2[1000],norma;
int i,j,itcount,m;
int MAXITER=2000;
float tol=0.00005;
for(i=0;i<n;i++)
{
x1[i]=0;
x0[i]=b[i];
//printf("x0[%d]=%lf\n",i,x0[i]);
//printf("x1[%d]=%lf\n",i,x1[i]);
}
itcount=0;
while(itcount<=MAXITER)
{
for(i=0;i<n;i++)
{
sum1[i]=sum2[i]=0;
for(j=0;j<i-1;j++)
{
sum1[i]=sum1[i]+((a[i][j]/a[i][i])*x1[j]);
}
for(j=i;j<n;j++)
{
sum2[i]=sum2[i]+((a[i][j]/a[i][i])*x0[j]);
}
x1[i]=(1-w)*x0[i]+w*(-sum1[i]-sum2[i]+(b[i]/a[i][i]));
}
itcount=itcount+1;
norma=x1[1]-x0[1];
for(m=0;m<n;m++)
{
if(fabs(x1[m]-x0[m])>norma)
norma=fabs(x1[m]-x0[m]);
}
if(norma<tol)
{
for(i=0;i<n;i++)
{
printf("x1[%d]=%f\n",i,x1[i]);
}
printf("itcount=%d\n",itcount);
goto K;
}
for(i=0;i<n;i++)
{
x0[i]=x1[i];
}
}
printf("OXI SYGKLISH META APO %d EPANALHJEIS",MAXITER);
goto K;
K:;
}
void esor(float **a,float *b,float *x0,float *x1,int n,float w)
{
/*H synartisi sor xrisimopoiei tin E.M. SOR gia ton pinaka A.*/
float sum1[1000],sum2[1000],norma;
int i,j,itcount,m;
int MAXITER=2000;
float tol=0.00005;
for(i=0;i<n;i++)
{
x1[i]=0;
x0[i]=b[i];
//printf("x0[%d]=%lf\n",i,x0[i]);
//printf("x1[%d]=%lf\n",i,x1[i]);
}
itcount=0;
while(itcount<=MAXITER)
{
for(i=0;i<n;i++)
{
sum1[i]=sum2[i]=0;
for(j=0;j<i-1;j++)
{
sum1[i]=sum1[i]+((a[i][j]/a[i][i])*x1[j]);
}
for(j=i;j<n;j++)
{
sum2[i]=sum2[i]+((a[i][j]/a[i][i])*x0[j]);
}
x1[i]=(1-w)*x0[i]+w*(-sum1[i]-sum2[i]+(b[i]/a[i][i]));
}
itcount=itcount+1;
norma=x1[1]-x0[1];
for(m=0;m<n;m++)
{
if(fabs(x1[m]-x0[m])>norma)
norma=fabs(x1[m]-x0[m]);
}
if(norma<tol)
{
for(i=0;i<n;i++)
{
//printf("x1[%d]=%f\n",i,x1[i]);
}
printf("%d",itcount);
goto K;
}
for(i=0;i<n;i++)
{
x0[i]=x1[i];
}
}
printf("OXI SYGKLISH META APO %d EPANALHJEIS",MAXITER);
goto K;
K: ;
}
void cgauss(float **a,float *b,float **m,float *x,float *c,int n)
{
int i,j,r,q;
float h=0;;
i=j=r=q=0;
for(i=0;i<n;i++)
{
a[i][n]=b[i];
}
for(r=0;r<n-1;r++)
{
if(a[r][r]<a[r+1][r])
{
for(q=0;q<n-1;q++)
{
b[q]=a[0][q];
a[0][q]=a[1][q];
a[1][q]=b[q];
}
}
for(i=r+1;i<n;i++)
{
m[i][r]=-(a[i][r]/a[r][r]);
for(j=r;j<n+1;j++)
{
a[i][j]=a[i][j]+m[i][r]*a[r][j];
}
}
}
if(a[n-1][n-1]==0)
{
printf("DEN YPARXEI MONADIKH LYSH");
exit(-1);
}
x[n-1]=a[n-1][n]/a[n-1][n-1];
for(i=n-2;i>=0;i--)
{
h=0;
for(j=i+1;j<=n-1;j++)
{
h=h+(a[i][j]*x[j]);
}
x[i]=((a[i][n]-(h))/a[i][i]);
}
for(i=0;i<n;i++)
{
c[i]=1-x[i];
}
for(i=0;i<n;i++)
{
printf("sfalma[%d]=%f\n",i,c[i]);
}
}
void cgjordan(float **a,float **a1,float *b,float **m,float *x,float *c,int n)
{
int i,j,r,q;
float *m1;
m1=(float*)malloc(n*sizeof(float));
i=j=r=q=0;
for(i=0;i<n;i++)
{
m1[i]=0;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
{
a1[i][j]=1;
}
else
{
a1[i][j]=0;
}
}
}
for(r=0;r<n-1;r++)
{
if(a[r][r]<a[r+1][r])
{
for(q=0;q<n-1;q++)
{
b[q]=a[0][q];
a[0][q]=a[1][q];
a[1][q]=b[q];
}
}
for(i=r+1;i<n;i++)
{
m[i][r]=-(a[i][r]/a[r][r]);
for(j=r;j<n;j++)
{
a[i][j]=a[i][j]+m[i][r]*a[r][j];
a1[i][j]=a1[i][j]+m[i][r]*a1[r][j];
}
}
}
i=j=r=q=0;
for(r=n-1;r>0;r--)
{
for(i=r-1;i>=0;i--)
{
m[i][r]=-(a[i][r]/a[r][r]);
for(j=r;j>=0;j--)
{
a[i][j]=a[i][j]+m[i][r]*a[r][j];
a1[i][j]=a1[i][j]+m[i][r]*a1[r][j];
}
}
}
for(i=0;i<n;i++)
{ // Sti synexeia ejisonei ta stoixeia tis
m1[i]=1/a[i][i]; // kyrias diagonioy(d) me to 1 me ti
// boithia tou pollaplasisti m1.
for(j=0;j<n;j++)
{
a[i][j]=a[i][j]*m1[i];
a1[i][j]=a1[i][j]*m1[i];
}
}
/* for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("a[%d][%d]=%f",i,j,a[i][j]);
}
printf("\n");
}*/
/*printf("O ANTISTROFOS TOU A EINAI:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("a1[%d][%d]=%f",i,j,a1[i][j]);
}
printf("\n");
}*/
for(i=0;i<n;i++)
{
x[i]=0;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
x[i]+=a1[i][j]*b[j]; // Telos ypologizoume tin lusi x apo tin x=a1*b.
}
}
for(i=0;i<n;i++)
{
c[i]=1-x[i];
}
for(i=0;i<n;i++)
{
printf("sfalma[%d]=%f\n",i,c[i]);
}
}
void csor(float **a,float *b,float *x0,float *x1,float *c,int n,float w)
{
/*H synartisi sor xrisimopoiei tin E.M. SOR gia ton pinaka A.*/
float sum1[1000],sum2[1000],norma;
int i,j,itcount,m;
int MAXITER=2000;
float tol=0.00005;
for(i=0;i<n;i++)
{
x1[i]=0;
x0[i]=b[i];
//printf("x0[%d]=%lf\n",i,x0[i]);
//printf("x1[%d]=%lf\n",i,x1[i]);
}
itcount=0;
while(itcount<=MAXITER)
{
for(i=0;i<n;i++)
{
sum1[i]=sum2[i]=0;
for(j=0;j<i-1;j++)
{
sum1[i]=sum1[i]+((a[i][j]/a[i][i])*x1[j]);
}
for(j=i;j<n;j++)
{
sum2[i]=sum2[i]+((a[i][j]/a[i][i])*x0[j]);
}
x1[i]=(1-w)*x0[i]+w*(-sum1[i]-sum2[i]+(b[i]/a[i][i]));
}
itcount=itcount+1;
norma=x1[1]-x0[1];
for(m=0;m<n;m++)
{
if(fabs(x1[m]-x0[m])>norma)
norma=fabs(x1[m]-x0[m]);
}
if(norma<tol)
{
for(i=0;i<n;i++)
{
//printf("x1[%d]=%f\n",i,x1[i]);
}
//printf("itcount=%d\n",itcount);
goto K;
}
for(i=0;i<n;i++)
{
x0[i]=x1[i];
}
}
printf("OXI SYGKLISH META APO %d EPANALHJEIS",MAXITER);
goto C;
K: for(i=0;i<n;i++)
{
c[i]=1-x1[i];
}
for(i=0;i<n;i++)
{
printf("sfalma[%d]=%f\n",i,c[i]);
} ;
C:;
}