#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:; }