freesky

task_sem3_3.1

Oct 10th, 2013
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>
  5. #include "eigen.h"
  6. #include "linsys.h"
  7.  
  8. #define de 1e-12
  9.  
  10. double val(int i, int n) {
  11.     return pow((2.0 * (1.0 - cos((M_PI * (2.0 * i - 1.0)) / (2.0 * (double)n + 1.0)))), -1.0);
  12. }
  13.  
  14. double f(double x, double *matrix, int n) {
  15.     // fill matrix
  16.     double *matrixp;
  17.     matrixp = matrix;
  18.     for (int i = 0; i < n; i++, matrix += 80)
  19.         for (int j = 0; j < n; j++)
  20.             if (i == j)
  21.                 matrixp[j] = (double)n - (double)i - x; // diagonal elements
  22.             else
  23.                 matrixp[j] = (double)n - (double)j; // others
  24.                
  25.     // decompose && calculate
  26.     if (decomp(matrix, matrix, n, 80) == FAILURE)
  27.         return 0.0; // we've found solution
  28.     else
  29.         return determ(matrix, n, 80); // otherwise
  30. }
  31.  
  32. double sign(double x) {
  33.     return (x / fabs(x));
  34. }
  35.  
  36. double solvex(double a, double b, double *matrix, int n) {
  37.     double c, x;
  38.    
  39.     do {
  40.         c = a + (b - a) / 2;
  41.        
  42.         double t = f(c, matrix, n); // get the determinant
  43.        
  44.         if ((t == 0.0) || (fabs(t) <= de) || ((b - a) <= de)) { // some checks
  45.             x = c;
  46.             break;
  47.         }
  48.        
  49.         if (sign(f(a, matrix, n)) * sign(t) < 0) // divide interval
  50.             b = c;
  51.         else
  52.             a = c;
  53.     } while (1);
  54.    
  55.     return x;
  56. }
  57.  
  58. int main(int argc, char *argv[]) {
  59.     clock_t start;
  60.     double points[80]; // own values
  61.     double jacobip[80]; // Jacobi own values
  62.     double *a, *ap; // the source matrix
  63.     int n; // dimensions
  64.    
  65.     a = (double *)malloc(sizeof(double) * 80 * 80);
  66.  
  67.     for (int e = 0; e <= 3; e++) {
  68.         n = 10 * (int)pow(2.0, (double)e);
  69.         printf("n = %d\n**********\n", n);
  70.        
  71.         // out method
  72.         start = clock();
  73.         for (int i = 0; i < n; i++)
  74.             points[i] = val(i + 1, n);
  75.            
  76.         double min1 = points[0];
  77.         for (int i = 0; i < n; i++)
  78.             if (points[i] < min1)
  79.                 min1 = points[i];
  80.                
  81.         double min2 = min1;
  82.         for (int i = 0; i < n; i++)
  83.             if ((points[i] < min2) && (points[i] != min1))
  84.                 min2 = points[i];
  85.                
  86.         double delta = fabs(min2 - min1) * 0.95;
  87.        
  88.         for (int i = 0; i < n; i++)
  89.             /*printf("#%d\texact value = %.16lf\tour value = %.16lf\n", i + 1, points[i], solvex(points[i] - delta, points[i] + delta, a, n));*/
  90.             solvex(points[i] - delta, points[i] + delta, a, n);
  91.        
  92.         double elapsed = (double)(clock() - start) / CLOCKS_PER_SEC;
  93.         printf("Our method = %lf", elapsed);
  94.        
  95.         // Jacobi method
  96.         ap = a;
  97.         for (int i = 0; i < n; i++, ap += 80)
  98.             for (int j = 0; j < n; j++)
  99.                 ap[j] = (double)n - (double)i;
  100.                
  101.         start = clock();
  102.         jacobi(a, n, 80, jacobip, NULL, 0);
  103.         elapsed = (double)(clock() - start) / CLOCKS_PER_SEC;
  104.         printf("\tJacobi method = %lf\n", elapsed);
  105.        
  106.         for (int i = 0; i < n; i++)
  107.             printf("#%d\tjacobi value = %.16lf\tour value = %.16lf\texact value = %.16lf\n", i + 1, jacobip[i], solvex(points[i] - delta, points[i] + delta, a, n), points[i]);
  108.            
  109.         putchar('\n');
  110.     }
  111.    
  112.     free(a);
  113.    
  114.     return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment