t1nman

Math.lab2

May 19th, 2013
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #define MAXS 3
  5.  
  6. int read_matrix(char *filename, float matrix[MAXS][MAXS+1]);
  7. void print_matrix(float matrix[MAXS][MAXS+1], int size);
  8. void diagonal_dominate(float matrix[MAXS][MAXS+1], int size);
  9. void cnt(float matrix[MAXS][MAXS+1], int size);
  10.  
  11. int main(int argc, char **argv)
  12. {
  13.     char *filename = "input.txt";
  14.     float matrix[MAXS][MAXS+1];
  15.     int size;
  16.  
  17.     printf("\tJacob's method\n");
  18.     size = read_matrix(filename, matrix);
  19.     printf("\n\tOriginal matrix:\n");
  20.     print_matrix(matrix, size);
  21.     diagonal_dominate(matrix, size);
  22.     printf("\tAfter making diagonal elements dominate:\n");
  23.     print_matrix(matrix, size);
  24.    
  25.     cnt(matrix, size);
  26.     //print_matrix(matrix, size);
  27.  
  28.     return 0;
  29. }
  30.  
  31. void diagonal_dominate(float matrix[MAXS][MAXS+1], int size)
  32. {
  33.     int j;
  34.  
  35.     for (j = 0; j < size+1; j++) {
  36.         matrix[0][j] += matrix[2][j];
  37.         matrix[2][j] -= matrix[0][j];
  38.         matrix[0][j] *= 2;
  39.         matrix[1][j] -= matrix[0][j];
  40.  
  41.     }
  42. }
  43.  
  44. void cnt(float matrix[MAXS][MAXS+1], int size)
  45. {
  46.     int i, j, k;
  47.     float factor, pure[MAXS][MAXS+1], B[MAXS], C[MAXS], X[MAXS], norm_B = 0.0, norm_C = 0.0;
  48.  
  49.     for (j = 0; j < size; j++) {
  50.         B[j] = 0.0;
  51.         C[j] = matrix[j][size];
  52.     }
  53.  
  54.     for (i = 0; i < size; i++)
  55.         for (j = 0; j < size+1; j++)
  56.             pure[i][j] = matrix[i][j]; 
  57.  
  58.     for (i = 0; i < size; i++) {
  59.         factor = matrix[i][i];
  60.         for (j = 0; j < size+1; j++) {
  61.             matrix[i][j] /= factor;
  62.             if ((i != j) && (j != size)) {
  63.                 B[i] += fabsf(matrix[i][j]);
  64.                 if (norm_B < B[i])
  65.                     norm_B = B[i];
  66.             }
  67.             if ((j == size) && (norm_C < matrix[i][j]))
  68.                 norm_C = matrix[i][j];
  69.         }
  70.     }
  71.     k = abs(log10(0.001) + log10(0.12) - log10(2.16) - log10(0.88) - 1);
  72.  
  73.  
  74.     printf("\tAfter dividing elements by main diagonal's factor:\n");
  75.     print_matrix(matrix, size);
  76.     printf("\t||B|| = %.2f\n\n\t||C|| = %.2f\n\n\tepsilon = 0.001\n\n", norm_B, norm_C);
  77.     printf("\tk > %d\n\n", k);
  78.  
  79.     for (j = 0; j < size; j++)
  80.         X[j] = C[j];
  81.     printf("\tk =  0    x1 = %8.4f    x2 = %8.4f    x3 = %8.4f\n", X[0], X[1], X[2]);
  82.    
  83.     for (i = 1; i <= k+3; i++) {
  84.         if (i == k+2)
  85.             printf("\t---------------------------------------------------------\n");
  86.         X[0] = -1/pure[0][0] * ( (matrix[0][1] + matrix[0][2]) * X[0] + C[0] );
  87.         X[1] = -1/pure[1][1] * ( (matrix[1][0] + matrix[1][2]) * X[1] + C[1] );
  88.         X[2] = -1/pure[2][2] * ( (matrix[2][0] + matrix[2][1]) * X[2] + C[2] );
  89.         printf("\tk = %2d    x1 = %8.4f    x2 = %8.4f    x3 = %8.4f\n", i, X[0], X[1], X[2]);  
  90.     }
  91.  
  92. }
  93.  
  94. int read_matrix(char *filename, float matrix[MAXS][MAXS+1])
  95. {
  96.     FILE *ifp;
  97.     int i, j, size = 0;
  98.  
  99.     ifp = fopen(filename, "r");
  100.     fscanf(ifp, "%d", &size);
  101.     for (i = 0; i < size; i++)
  102.         for (j = 0; j < size+1; j++)
  103.             fscanf(ifp, "%f", &matrix[i][j]);
  104.     fclose(ifp);
  105.  
  106.     return size;
  107. }
  108.  
  109. void print_matrix(float matrix[MAXS][MAXS+1], int size)
  110. {
  111.     int i, j;
  112.  
  113.     putchar('\n');
  114.     for (i = 0; i < size; i++) {
  115.         for (j = 0; j < size+1; j++)
  116.             printf("  %10.2f",matrix[i][j]);
  117.         putchar('\n');
  118.     }
  119.     putchar('\n');
  120. }
Advertisement
Add Comment
Please, Sign In to add comment