Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication2.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <cstdio>
- #include <cfloat>
- #include <cmath>
- #include <utility>
- using namespace std;
- void mult_mat_vec(double* mat, double* vec, double* res, int n) {
- for (int i = 0; i < n; i++) {
- res[i] = 0;
- for (int j = 0; j < n; j++) {
- res[i] += mat[i * n + j] * vec[j];
- }
- }
- }
- double l_inf_dist(double* v1, double* v2, int n) {
- double res = DBL_MIN;
- for (int i = 0; i < n; i++) {
- double diff = fabs(v1[i] - v2[i]);
- res = (diff > res) ? diff : res;
- }
- return res;
- }
- void div_vec(double* v1, double* v2, double* res, int n) {
- for (int i = 0; i < n; i++) {
- res[i] = v1[i] / v2[i];
- }
- }
- double eigen(double* mat, double* mem, int n, double eps = 1e-8) {
- double* y0 = mem;
- double* y1 = mem + n;
- double* y = mem + 2 * n;
- double* y_prev = mem + 3 * n;
- for (int i = 0; i < n; i++) {
- y0[i] = 1;
- y_prev[i] = DBL_MAX;
- }
- while (true) {
- mult_mat_vec(mat, y0, y1, n);
- div_vec(y1, y0, y, n);
- if (l_inf_dist(y, y_prev, n) < eps) {
- return y[0] / y_prev[0];
- }
- swap(y0, y1);
- swap(y, y_prev);
- }
- }
- void print_vec(double* vec, int n) {
- for (int i = 0; i < n; i++) {
- printf("%.4f ", vec[i]);
- }
- }
- void gen_test_mat(double* mat, int n) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- if (i == j) {
- mat[i * n + j] = n + i;
- } else {
- mat[i * n + j] = n * n * (i + j);
- }
- }
- }
- }
- double A[] = {
- 1, 0, 0,
- 0, 1, 0,
- 0, 0, 1
- };
- double V[] = { 1, 2, 3 };
- int _tmain(int argc, _TCHAR* argv[])
- {
- const int n = 3;
- double mem[4 * n] = { 0 };
- gen_test_mat(A, n);
- printf("Answer: %.8f", eigen(A, mem, n));
- scanf_s("Press any key");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement