freesky

task_sem3_3.2

Nov 23rd, 2013
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.58 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.  
  7. double *a; // main matrix
  8. double *at; // matrix backup
  9. double *v; // vectors matrix
  10.  
  11. int cmpitems_p(const void *p1, const void *p2) {
  12.     if (*(double *)p1 < *(double *)p2)
  13.         return -1;
  14.     else if (*(double *)p1 > *(double *)p2)
  15.         return 1;
  16.  
  17.     return 0;
  18. }
  19.  
  20. double val(int i, int n) {
  21.     double s;
  22.  
  23.     s = 4 * pow(sin((i + 1.0) * M_PI / (2.0 * n + 2.0)), 2.0);
  24.     return (pow(s, 3.0) - 5.0 * pow(s, 2.0) + 8.0 * s);
  25. }
  26.  
  27. void getA(int n) {
  28.     double *c = (double *)malloc(sizeof(double) * n * n);
  29.     double *t = (double *)malloc(sizeof(double) * n * n);
  30.     double *t1 = (double *)malloc(sizeof(double) * n * n);
  31.  
  32.     a = (double *)malloc(sizeof(double) * n * n);
  33.     at = (double *)malloc(sizeof(double) * n * n);
  34.     v = (double *)malloc(sizeof(double) * n * n);
  35.  
  36.     for (int i = 0; i < n; i++)
  37.         for (int j = 0; j < n; j++) {
  38.             if (i == j)
  39.                 *(c + i * n + j) = 2;
  40.             else if ((j == (i + 1)) || (j == (i - 1)))
  41.                 *(c + i * n + j) = 1;
  42.             else
  43.                 *(c + i * n + j) = 0;
  44.  
  45.             *(t + i * n + j) = 0;
  46.             *(t1 + i * n + j) = 0;
  47.         }
  48.  
  49.     for (int i = 0; i < n; i++) // A = 8C
  50.         for (int j = 0; j < n; j++)
  51.             *(a + i * n + j) = 8 * *(c + i * n + j);
  52.  
  53.     for (int i = 0; i < n; i++) // T = C^2
  54.         for (int j = 0; j < n; j++)
  55.             for (int x = 0; x < n; x++)
  56.                 *(t + i * n + j) += *(c + i * n + x) * *(c + x * n + j);
  57.  
  58.     for (int i = 0; i < n; i++) // A = 8C - 5C^2
  59.         for (int j = 0; j < n; j++)
  60.             *(a + i * n + j) -= 5 * *(t + i * n + j);
  61.  
  62.     for (int i = 0; i < n; i++) // T_1 = C^3 = TC^2
  63.         for (int j = 0; j < n; j++)
  64.             for (int x = 0; x < n; x++)
  65.                 *(t1 + i * n + j) += *(t + i * n + x) * *(c + x * n + j);
  66.  
  67.     for (int i = 0; i < n; i++) // A = 8C - 5C^2 + C^3
  68.         for (int j = 0; j < n; j++)
  69.             *(a + i * n + j) += *(t1 + i * n + j);
  70.  
  71.     for (int i = 0; i < n; i++)
  72.         for (int j = 0; j < n; j++)
  73.             *(at + i * n + j) = *(a + i * n + j);
  74.  
  75.     free(c);
  76.     free(t);
  77.     free(t1);
  78. }
  79.  
  80. int main(int argc, char *argv[]) {
  81.     int n;
  82.     double *vals;
  83.     double *j_vals;
  84.     int *order;
  85.     double *t;
  86.     double *j_vecs;
  87.     double *vecs;
  88.  
  89.     printf("n = "); scanf("%d", &n);
  90.     getA(n);
  91.  
  92.     vals = (double *)malloc(sizeof(double) * n);
  93.     j_vals = (double *)malloc(sizeof(double) * n);
  94.     j_vecs = (double *)malloc(sizeof(double) * n * n);
  95.     vecs = (double *)malloc(sizeof(double) * n * n);
  96.     order = (int *)malloc(sizeof(int) * n);
  97.     t = (double *)malloc(sizeof(double) * n);
  98.  
  99.     for (int i = 0; i < n; i++)
  100.         *(vals + i) = val(i, n);
  101.  
  102.     clock_t start;
  103.     start = clock();
  104.  
  105.     jacobi(a, n, n, j_vals, v, 1);
  106.  
  107.     double elapsed = (double)(clock() - start) / CLOCKS_PER_SEC;
  108.  
  109.     qsort(vals, n, sizeof(double), cmpitems_p);
  110.  
  111.     for (int i = 0; i < n; i++)
  112.         *(t + i) = *(j_vals + i);
  113.  
  114.     qsort(j_vals, n, sizeof(double), cmpitems_p);
  115.  
  116.     printf("Exact values\t\tJacobi values\n");
  117.     for (int i = 0; i < n; i++)
  118.         printf("%.16lf\t%.16lf\n", *(vals + i), *(j_vals + i));
  119.  
  120.     putchar('\n');
  121.  
  122.     for (int i = 0; i < n; i++)
  123.         for (int j = 0; j < n; j++)
  124.             if (*(t + j) == *(j_vals + i))
  125.                 *(order + i) = j;
  126.  
  127.     for (int i = 0; i < n; i++)
  128.         for (int j = 0; j < n; j++) {
  129.             *(j_vecs + i * n + j) = 0;
  130.             *(vecs + i * n + j) = 0;
  131.         }
  132.  
  133.     for (int i = 0; i < n; i++) // Av
  134.         for (int j = 0; j < n; j++)
  135.             for (int x = 0; x < n; x++)
  136.                 *(j_vecs + i * n + j) += *(at + j * n + x) * *(v + i * n + x);
  137.  
  138.     for (int i = 0; i < n; i++) // lambda v
  139.         for (int j = 0; j < n; j++)
  140.             *(vecs + i * n + j) = *(vals + i) * *(v + *(order + i) * n + j);
  141.  
  142.     printf("A * v\n");
  143.  
  144.     for (int i = 0; i < n; i++)
  145.         for (int j = 0; j < n; j++)
  146.             printf("%.16lf%c", *(j_vecs + i * n + j), ((j) == ((n) - 1)) ? '\n' : ' ');
  147.  
  148.     putchar('\n');
  149.  
  150.     printf("lambda * v\n");
  151.     for (int i = 0; i < n; i++)
  152.         for (int j = 0; j < n; j++)
  153.             printf("%.16lf%c", *(vecs + i * n + j), ((j) == ((n) - 1)) ? '\n' : ' ');
  154.  
  155.     putchar('\n');
  156.     printf("Time elapsed = %.16lf\n", elapsed);
  157.  
  158.     free(a);
  159.     free(at);
  160.     free(v);
  161.     free(vals);
  162.     free(j_vals);
  163.     free(order);
  164.     free(t);
  165.     free(j_vecs);
  166.     free(vecs);
  167.  
  168.     return 0;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment