精華區beta NAOE-87 關於我們 聯絡資訊
// Jacobi method. // #include<stdio.h> #include<process.h> #include<math.h> #define dim 10 #define mistake 1.0e-5 double a[dim+1][dim+1], b[dim+1], old_x[dim+1], new_x[dim+1]; void mprintf(int m, int n, double a[][dim+1], double b[dim+1]); void exchange(int n, int r1, int r2, double a[][dim+1], double b[dim+1]); int main(void) { int m,i,j,k,ipvt_store,flag,index; double temp; char ch; FILE *fp; fp=fopen("jacobi.dat","r"); if ( fp==NULL ) { printf("Can't open file.\n"); exit(1); } // Loading... // fscanf(fp,"%d",&m); for (i=1; i<=m; i++) { for (j=1; j<=m; j++) fscanf(fp,"%lf ",&a[i][j]); fscanf(fp,"%lf\n",&b[i]); } for (i=1; i<=m; i++) fscanf(fp,"%lf ",&old_x[i]); // Pivoting... // for (k=1; k<m; k++) { ipvt_store=k; temp=a[k][k]; for (i=k; i<=m; i++) if ( a[i+1][k] > temp ) { ipvt_store=i+1; temp=a[i+1][k]; } if ( ipvt_store != k ) exchange(m, ipvt_store, k, a, b); } for (i=1; i<=m; i++) { temp=a[i][i]; for (j=1; j<=m; j++) a[i][j]/=temp; a[i][i]=temp; b[i]/=temp; } index=0; do { index++; flag=0; for (i=1; i<=m; i++) new_x[i]=b[i]; for (i=1; i<=m; i++) { for (j=1; j<=m; j++) { if ( i==j ) continue; new_x[i] = new_x[i] - a[i][j]*old_x[j]; } if ( fabs(new_x[i]-old_x[i]) > mistake ) flag=1; } for (j=1; j<=m; j++) old_x[j]=new_x[j]; printf("#%d\n",index); mprintf(m,m,a,new_x); }while ( flag==1 ); for (i=1; i<=m; i++) printf("x%d = %10.5lf\n",i,new_x[i]); return 0; } void mprintf(int m, int n, double a[][dim+1], double b[dim+1]) { int i,j; printf("----------\n"); for (i=1; i<=m; i++) { for (j=1; j<=n; j++) printf("%10.5lf ",a[i][j]); printf("%10.5lf\n",b[i]); } } void exchange(int n, int r1, int r2, double a[][dim+1], double b[dim+1]) { int j; double temp; for (j=1; j<=n; j++) { temp=a[r1][j]; a[r1][j]=a[r2][j]; a[r2][j]=temp; } temp=b[r1]; b[r1]=b[r2]; b[r2]=temp; } -- ※ 發信站: 批踢踢實業坊(ptt.twbbs.org) ◆ From: t195-250.dialup.seed.net.tw