Advertisement
Guest User

vsevolodbolshoegnezdo

a guest
Oct 24th, 2014
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.86 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #define Max(a,b) ((a)>(b)?(a):(b))
  6. #define N 10
  7. double maxeps = 0.1e-7;
  8. int itmax = 100;
  9. int i,j,k;
  10. double eps;
  11. double A[N][N], B[N][N];
  12. const double pi = acos(-1.0);
  13. void relax(double w)
  14. {
  15.     for(i = 1; i <= N - 2; i++) {
  16.         for(j = 1; j <= N - 2; j++) {
  17.             B[i][j] = (A[i + 1][j] + A[i - 1][j] + A[i][j + 1] + A[i][j - 1]) / 4;
  18.         }
  19.     }
  20.     for(i = 1; i <= N - 2; i++) {
  21.         for(j = 1; j <= N - 2; j++) {
  22.             eps = Max(eps, fabs(A[i][j] - w * B[i][j] - (1 - w) * A[i][j]));
  23.             A[i][j] = w * B[i][j] + (1 - w) * A[i][j];
  24.         }
  25.     }
  26.     /*for (i = 0; i < N; i++) {
  27.         for (j = 0; j < N; j++) {
  28.             printf("%.5lf ", A[i][j]);
  29.         }
  30.         printf("\n");
  31.     }*/
  32.  
  33. }
  34. void init();
  35. //void wtime(double *t);
  36. int main(int an, char **as)
  37. {   int it, i, j;
  38.     double time0, time1, r = 1 - (pi / (2 * N)) * (pi / (2 * N)), w;
  39.     init();
  40.     //wtime(&time0);
  41.     w = 0.8;//1 / (1 - r * r / 2);
  42.     for(it = 1; it <= itmax; it++) {
  43.         eps = 0.;
  44.         relax(w);
  45.         printf( "it=%4i eps=%f\n", it,eps);
  46.         //w = 1 / (1 - r * r * w / 4);
  47.         if (eps < maxeps) break;
  48.     }
  49.     for (i = 0; i < N; i++) {
  50.         for (j = 0; j < N; j++) {
  51.             printf("%.5lf ", A[i][j]);
  52.         }
  53.         printf("\n");
  54.     }
  55.     printf("%.5lf\n", eps);
  56.     //wtime(&time1);
  57.     //printf("Time in seconds=%gs\t",time1 - time0);
  58.     return 0;
  59. }
  60. void init()
  61. {
  62.     for(i = 0; i <= N-1; i++) {
  63.         for(j = 0; j <= N-1; j++) {
  64.             if(i == N - 1) {
  65.                 A[i][j]= sin(pi * (j / double(N - 1)));
  66.             } else {
  67.                 if (i == 0) {
  68.                     A[i][j]= sin(pi * (j / double(N - 1))) * exp(-j / double(N - 1));
  69.                 } else {
  70.                     A[i][j] = 0;
  71.                 }
  72.             }
  73.             B[i][j] = A[i][j];
  74.         }
  75.     }
  76. }
  77.  
  78. /*void wtime(double *t)
  79. {
  80.     static int sec = -1;
  81.     struct timeval tv;
  82.     gettimeofday(&tv, (void *)0);
  83.     if (sec < 0) sec = tv.tv_sec;
  84.     *t = (tv.tv_sec - sec) + 1.0e-6 * tv.tv_usec;
  85. } */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement