Advertisement
Guest User

Untitled

a guest
Mar 24th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. // ConsoleApplication2.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <cstdio>
  6. #include <cfloat>
  7. #include <cmath>
  8. #include <utility>
  9.  
  10. using namespace std;
  11.  
  12. void mult_mat_vec(double* mat, double* vec, double* res, int n) {
  13.     for (int i = 0; i < n; i++) {
  14.         res[i] = 0;
  15.         for (int j = 0; j < n; j++) {
  16.             res[i] += mat[i * n + j] * vec[j];
  17.         }
  18.     }
  19. }
  20.  
  21. double l_inf_dist(double* v1, double* v2, int n) {
  22.     double res = DBL_MIN;
  23.     for (int i = 0; i < n; i++) {
  24.         double diff = fabs(v1[i] - v2[i]);
  25.         res = (diff > res) ? diff : res;
  26.     }
  27.     return res;
  28. }
  29.  
  30. void div_vec(double* v1, double* v2, double* res, int n) {
  31.     for (int i = 0; i < n; i++) {
  32.         res[i] = v1[i] / v2[i];
  33.     }
  34. }
  35.  
  36. double eigen(double* mat, double* mem, int n, double eps = 1e-8) {
  37.     double* y0 = mem;
  38.     double* y1 = mem + n;
  39.     double* y = mem + 2 * n;
  40.     double* y_prev = mem + 3 * n;
  41.  
  42.     for (int i = 0; i < n; i++) {
  43.         y0[i] = 1;
  44.         y_prev[i] = DBL_MAX;
  45.     }
  46.  
  47.     while (true) {
  48.         mult_mat_vec(mat, y0, y1, n);
  49.         div_vec(y1, y0, y, n);
  50.         if (l_inf_dist(y, y_prev, n) < eps) {
  51.             return y[0] / y_prev[0];
  52.         }
  53.         swap(y0, y1);
  54.         swap(y, y_prev);
  55.     }
  56. }
  57.  
  58. void print_vec(double* vec, int n) {
  59.     for (int i = 0; i < n; i++) {
  60.         printf("%.4f ", vec[i]);
  61.     }
  62. }
  63.  
  64. void gen_test_mat(double* mat, int n) {
  65.     for (int i = 0; i < n; i++) {
  66.         for (int j = 0; j < n; j++) {
  67.             if (i == j) {
  68.                 mat[i * n + j] = n + i;
  69.             } else {
  70.                 mat[i * n + j] = n * n * (i + j);
  71.             }
  72.         }
  73.     }
  74. }
  75.  
  76. double A[] = {
  77.     1, 0, 0,
  78.     0, 1, 0,
  79.     0, 0, 1
  80. };
  81.  
  82. double V[] = { 1, 2, 3 };
  83.  
  84. int _tmain(int argc, _TCHAR* argv[])
  85. {
  86.     const int n = 3;
  87.    
  88.     double mem[4 * n] = { 0 };
  89.  
  90.     gen_test_mat(A, n);
  91.  
  92.     printf("Answer: %.8f", eigen(A, mem, n));
  93.  
  94.     scanf_s("Press any key");
  95.  
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement