Browse Source

Lab 6 changes

Vano1k 4 months ago
parent
commit
063d65d986
14 changed files with 336 additions and 65 deletions
  1. BIN
      Lab6/Otchet_lab6.pdf
  2. 20 0
      Lab6/graph1.m
  3. 19 0
      Lab6/graph2.m
  4. 20 0
      Lab6/graph3.m
  5. 21 0
      Lab6/graph4.m
  6. 181 0
      Lab6/lab.c
  7. BIN
      Lab6/lab.exe
  8. 7 5
      Lab6/lab2.c
  9. 10 5
      Lab6/lab3.c
  10. 7 4
      Lab6/lab4.c
  11. 14 14
      Lab6/lab_6_M_high.csv
  12. 14 14
      Lab6/lab_6_M_low.csv
  13. 14 14
      Lab6/lab_6_eps.csv
  14. 9 9
      Lab6/lab_6_error.csv

BIN
Lab6/Otchet_lab6.pdf


+ 20 - 0
Lab6/graph1.m

@@ -0,0 +1,20 @@
+X = logspace(-2,6,8);
+X1=linspace(0.1,1000000,8);
+data=csvread('lab_6_error.csv'); % reading csv file
+X = data(:,1);
+Y = data(:,2);
+Y1 = data(:,3);
+figure;
+semilogx(X,Y1,'-o',"LineWidth",2);
+hold on;
+grid on;
+title('Precision vector (Separatedness)');
+xlabel('Separatedness');
+ylabel('Precision vector');
+figure;
+semilogx(X,Y,'-o',"LineWidth",2);
+hold on;
+grid on;
+title('Precision value (Separatedness)');
+xlabel('Separatedness');
+ylabel('Precision value');

+ 19 - 0
Lab6/graph2.m

@@ -0,0 +1,19 @@
+X=logspace(-2,-15,14);
+data=csvread('lab_6_eps.csv'); % reading csv file
+X = data(:,1);
+Y = data(:,2);
+Y1 = data(:,3);
+figure;
+loglog(X,Y1,'-o');
+hold on;
+grid on;
+title('Precision vector (Eps)');
+xlabel('Eps');
+ylabel('precision vector');
+figure;
+loglog(X,Y,'-o');
+hold on;
+grid on;
+title('Precision value(Eps)');
+xlabel('Eps');
+ylabel('precision nvalue');

+ 20 - 0
Lab6/graph3.m

@@ -0,0 +1,20 @@
+X=logspace(-2,-15,14);
+data=csvread('lab_6_M_low.csv'); % reading csv file
+data2=csvread('lab_6_M_high.csv'); % reading csv file
+X = data(:,1);
+Y = data(:,2);
+Y1 = data2(:,2);
+figure;
+semilogx(X,Y,'-o');
+hold on;
+grid on;
+title('Iterations(Eps)');
+xlabel('Eps');
+ylabel('Iterations');
+figure;
+semilogx(X,Y1,'-o');
+hold on;
+grid on;
+title('Iterations(Eps)');
+xlabel('Eps');
+ylabel('Iterations');

+ 21 - 0
Lab6/graph4.m

@@ -0,0 +1,21 @@
+X=linspace(10,90,9);
+data=csvread('lab_6_M_10.csv'); % reading csv file
+X = data(:,1);
+Y = data(:,2);
+Y1 = data(:,3);
+figure;
+semilogy(X,Y1,'-o');
+hold on;
+grid on;
+title('Precision Vector (Iterations)');
+xlabel('Iterations');
+ylabel('Precision');
+
+
+figure;
+semilogy(X,Y,'-o');
+hold on;
+grid on;
+title('Precision Value (Iterations)');
+xlabel('Iterations');
+ylabel('Precision');

+ 181 - 0
Lab6/lab.c

@@ -0,0 +1,181 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include<math.h>
+
+// Необязательный флаг для дебага (можно удалить)
+#define DEBUG 0
+
+// Фиксированная размерность матрицы (обрабатывается препроцессором, просто alias)
+#define N 10
+
+// Тип вектора
+typedef double vec[N];
+
+// Тип матрицы
+typedef double mat[N][N];
+
+// Структура для удобного сбора данных
+struct result {
+	double lambda;
+    int M;
+};
+
+// Скалярное произведение
+double dot(vec v, vec u) {
+    double res = 0;
+    for(int i = 0; i < N; i++) res += v[i]*u[i];
+
+    return res;
+}
+
+// Прибавление вектора
+void add(vec v, vec u) {
+    for(int i = 0; i < N; i++) {
+        v[i] += u[i];
+    }
+}
+
+// Функция для вычисления сдвига
+void shift(mat m, double s) {
+    for(int i = 0; i < N; i++) {
+        m[i][i] =  m[i][i] - s; 
+    }
+}
+
+// Умножение матрицы на вектор (res = m*v)
+void apply(mat m, vec v, vec res) {   
+    for(int i = 0; i < N; i++) {
+        res[i] = 0;
+        for(int j = 0; j < N; j++) {
+            res[i] += m[i][j] * v[j]; 
+        }
+    }
+}
+
+// Функция нормализации
+void normalize(vec v){
+    double norm = sqrt(dot(v, v));
+    for(int i = 0; i < N; i++) {
+        v[i] /= norm;
+    }
+}
+
+// Функция для вычисления ошибки между векторами
+double error_vector(vec x, vec x1) {
+    double error = 0;
+    for (int i = 0; i < N; i++) {
+        error = fmax(error, fabs(fabs(x[i]) - fabs(x1[i])));
+    }
+    return error;
+}
+
+// Копирование вектора
+void copy_vec(vec v, vec copy) {
+    for(int i = 0; i < N; i++) {
+        copy[i] = v[i];
+    }
+}
+
+// Чтение матрицы из файла
+void mat_from_file(FILE* f, mat m) {
+	double d;
+	for (int i = 0; i < N; i++) {
+		for (int j = 0; j < N; j++) {
+			fscanf(f, "%lf,", &d);
+			m[i][j] = d;
+		}
+	}
+}
+
+// Чтение вектора из файла
+void vec_from_file(FILE* f, vec v) {
+	double d;
+	for (int i = 0; i < N; i++) {
+		fscanf(f, "%lf,", &d);
+		v[i] = d;
+	}
+}
+
+// Красивая печать матрицы
+void print_mat(mat m) {
+    for(int j = 0; j < N; j++) {
+        printf("-----------|");
+    }
+    printf("\n");
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            printf("%10.4lf |", m[i][j]);
+        }
+        printf("\n");
+        for(int j = 0; j < N; j++) {
+            printf("-----------|");
+        }
+        printf("\n");
+    }
+}
+
+// Красивая печать вектора
+void print_vec(vec v) {
+    for(int j = 0; j < N; j++) {
+        printf("%10.4lf |", v[j]);
+    }
+    printf("\n");
+}
+
+struct result solve(mat m, vec x, double shift_v, double eps, vec eigen_vector) {
+    struct result res;
+    shift(m, shift_v);
+    res.M = 0;
+    vec y;
+    double lambda2;
+    normalize(x);
+    for (int i = 0; i < 100; i++) {
+        apply(m, x, y);
+        res.lambda = shift_v + dot(x, y)/dot(x,x);
+        res.M++;
+        normalize(y);
+        copy_vec(y, eigen_vector);
+        copy_vec(y, x);
+        if (fabs((res.lambda-lambda2)/lambda2) < eps){
+            break;
+        }
+        lambda2 = res.lambda;
+    }
+    return res;
+}
+
+
+int main(){
+    vec x;
+    FILE* f;
+	if ((f = fopen("matrix.txt", "r")) == NULL) return 1;
+    FILE* fs;
+	if ((fs = fopen("value_shift.txt", "r")) == NULL) return 1;
+    FILE* vf;
+    if ((vf = fopen("vector_shift.txt", "r")) == NULL) return 1;
+
+    FILE* file;
+    if ((file = fopen("lab_6_error.csv", "w+")) == NULL) return 1;
+    mat m;
+    vec eigen_vector;
+    for (int i = 0; i < 9; i++) {
+        for(int j = 0; j < N; j++) {
+            x[j] = 1;
+        }
+        mat_from_file(f, m);
+        vec_from_file(vf, eigen_vector);
+
+        double shift_v;
+        fscanf(fs, "%lf\n", &shift_v);
+
+        vec eigen_approximate;
+        struct result solu = solve(m, x, shift_v, pow(10,-10), eigen_approximate);
+        print_vec(eigen_vector);
+        print_vec(eigen_approximate);
+        printf("\n");
+        fprintf(file, "%e, %e, %e\n", pow(10,(i-2)), fabs(pow(10,i-1) - solu.lambda)/pow(10,i-1), error_vector(eigen_vector,eigen_approximate));
+    }
+    fclose(f);
+    fclose(fs);
+    fclose(file);
+}

BIN
Lab6/lab.exe


+ 7 - 5
Lab6/lab2.c

@@ -131,11 +131,13 @@ void print_vec(vec v) {
 }
 
 // Реализация метода
-struct result solve(mat m, vec x, double shift_v, double eps, vec eigen_vector, double eigen) {
+struct result solve(mat m, vec x, double shift_v, double eps, vec eigen_vector) {
     struct result res;
     shift(m, shift_v);
     res.M = 0;
     vec y;
+    double lambda2;
+    normalize(x);
     for (int i = 0; i < 10000; i++) {
         apply(m, x, y);
         res.lambda = shift_v + dot(x, y)/dot(x,x);
@@ -143,14 +145,14 @@ struct result solve(mat m, vec x, double shift_v, double eps, vec eigen_vector,
         normalize(y);
         copy_vec(y, eigen_vector);
         copy_vec(y, x);
-        if (fabs(eigen-res.lambda) < eps){
+        if (fabs((res.lambda-lambda2)/lambda2) < eps){
             break;
         }
+        lambda2 = res.lambda;
     }
     return res;
 }
 
-
 int main(){
     vec x;
     FILE* f;
@@ -174,11 +176,11 @@ int main(){
         for(int j = 0; j < N; j++) {
             x[j] = 1;
         }
-        struct result solu = solve(m_copy, x, shift_v, pow(10,(-i)), eigen_approximate, 10);
+        struct result solu = solve(m_copy, x, shift_v, pow(10,(-i)), eigen_approximate);
         print_vec(eigen_vector);
         print_vec(eigen_approximate);
         printf("\n");
-        fprintf(file, "%e, %e, %e\n", pow(10,(-i)), fabs(10 - solu.lambda), error_vector(eigen_vector,eigen_approximate));
+        fprintf(file, "%e, %e, %e\n", pow(10,(-i)), fabs(10 - solu.lambda)/10, error_vector(eigen_vector,eigen_approximate));
     }
     fclose(f);
     fclose(fs);

+ 10 - 5
Lab6/lab3.c

@@ -131,11 +131,13 @@ void print_vec(vec v) {
 }
 
 // Реализация метода
-struct result solve(mat m, vec x, double shift_v, double eps, vec eigen_vector, double eigen) {
+struct result solve(mat m, vec x, double shift_v, double eps, vec eigen_vector) {
     struct result res;
     shift(m, shift_v);
     res.M = 0;
     vec y;
+    double lambda2;
+    normalize(x);
     for (int i = 0; i < 10000; i++) {
         apply(m, x, y);
         res.lambda = shift_v + dot(x, y)/dot(x,x);
@@ -143,9 +145,10 @@ struct result solve(mat m, vec x, double shift_v, double eps, vec eigen_vector,
         normalize(y);
         copy_vec(y, eigen_vector);
         copy_vec(y, x);
-        if (fabs(eigen-res.lambda) < eps){
+        if (fabs((res.lambda-lambda2)/lambda2) < eps){
             break;
         }
+        lambda2 = res.lambda;
     }
     return res;
 }
@@ -169,6 +172,7 @@ int main(){
     fscanf(fs, "%lf\n", &shift_v);
     mat_from_file(f, m);
     vec_from_file(vf, eigen_vector);
+    print_mat(m);
     vec eigen_approximate;
     for (int i = 2; i < 16; i++) {
         mat m_copy;
@@ -176,7 +180,7 @@ int main(){
         for(int j = 0; j < N; j++) {
             x[j] = 1;
         }
-        struct result solu = solve(m_copy, x, shift_v, pow(10,(-i)), eigen_approximate, 0.1);
+        struct result solu = solve(m_copy, x, shift_v, pow(10,(-i)), eigen_approximate);
         print_vec(eigen_vector);
         print_vec(eigen_approximate);
         printf("\n");
@@ -184,14 +188,15 @@ int main(){
     }
     fscanf(fs, "%lf\n", &shift_v);
     mat_from_file(f, m);
+    print_mat(m);
     vec_from_file(vf, eigen_vector);
     for (int i = 2; i < 16; i++) {
         mat m_copy;
         copy_mat(m,m_copy);
         for(int j = 0; j < N; j++) {
-            x[j] = 1;
+            x[j] = j;
         }
-        struct result solu = solve(m_copy, x, shift_v, pow(10,(-i)), eigen_approximate, 1000);
+        struct result solu = solve(m_copy, x, shift_v, pow(10,(-i)), eigen_approximate);
         print_vec(eigen_vector);
         print_vec(eigen_approximate);
         printf("\n");

+ 7 - 4
Lab6/lab4.c

@@ -131,21 +131,24 @@ void print_vec(vec v) {
 }
 
 // Реализация метода
-struct result solve(mat m, vec x, double shift_v, double eps, vec eigen_vector, double eigen, int iter) {
+struct result solve(mat m, vec x, double shift_v, double iter, vec eigen_vector) {
     struct result res;
     shift(m, shift_v);
     res.M = 0;
     vec y;
-    for (int i = 0; i < iter; i++) {
+    double lambda2;
+    normalize(x);
+    for (int i = 0; i < 10000; i++) {
         apply(m, x, y);
         res.lambda = shift_v + dot(x, y)/dot(x,x);
         res.M++;
         normalize(y);
         copy_vec(y, eigen_vector);
         copy_vec(y, x);
-        if (fabs(eigen-res.lambda) < eps){
+        if (res.M >= iter){
             break;
         }
+        lambda2 = res.lambda;
     }
     return res;
 }
@@ -174,7 +177,7 @@ int main(){
         for(int j = 0; j < N; j++) {
             x[j] = 1;
         }
-        struct result solu = solve(m_copy, x, shift_v, pow(10,(-15)), eigen_approximate, 10, 10*i);
+        struct result solu = solve(m_copy, x, shift_v, i*10, eigen_approximate);
         print_vec(eigen_vector);
         print_vec(eigen_approximate);
         printf("\n");

+ 14 - 14
Lab6/lab_6_M_high.csv

@@ -1,14 +1,14 @@
-1.000000e-02, 45
-1.000000e-03, 50
-1.000000e-04, 55
-1.000000e-05, 60
-1.000000e-06, 65
-1.000000e-07, 70
-1.000000e-08, 76
-1.000000e-09, 81
-1.000000e-10, 86
-1.000000e-11, 91
-1.000000e-12, 97
-1.000000e-13, 107
-1.000000e-14, 107
-1.000000e-15, 107
+1.000000e-02, 16
+1.000000e-03, 21
+1.000000e-04, 27
+1.000000e-05, 32
+1.000000e-06, 37
+1.000000e-07, 42
+1.000000e-08, 47
+1.000000e-09, 52
+1.000000e-10, 58
+1.000000e-11, 63
+1.000000e-12, 68
+1.000000e-13, 73
+1.000000e-14, 78
+1.000000e-15, 83

+ 14 - 14
Lab6/lab_6_M_low.csv

@@ -1,14 +1,14 @@
-1.000000e-02, 18
-1.000000e-03, 23
-1.000000e-04, 28
-1.000000e-05, 34
-1.000000e-06, 39
-1.000000e-07, 44
-1.000000e-08, 49
-1.000000e-09, 54
-1.000000e-10, 59
-1.000000e-11, 64
-1.000000e-12, 70
-1.000000e-13, 75
-1.000000e-14, 80
-1.000000e-15, 85
+1.000000e-02, 22
+1.000000e-03, 27
+1.000000e-04, 32
+1.000000e-05, 37
+1.000000e-06, 43
+1.000000e-07, 48
+1.000000e-08, 53
+1.000000e-09, 58
+1.000000e-10, 63
+1.000000e-11, 68
+1.000000e-12, 74
+1.000000e-13, 79
+1.000000e-14, 84
+1.000000e-15, 89

+ 14 - 14
Lab6/lab_6_eps.csv

@@ -1,14 +1,14 @@
-1.000000e-02, 7.880280e-03, 1.162500e-02
-1.000000e-03, 8.468009e-04, 3.758192e-03
-1.000000e-04, 9.093220e-05, 1.242414e-03
-1.000000e-05, 9.763859e-06, 4.042052e-04
-1.000000e-06, 6.709679e-07, 1.059754e-04
-1.000000e-07, 7.204464e-08, 3.495071e-05
-1.000000e-08, 7.735734e-09, 1.137954e-05
-1.000000e-09, 8.306191e-10, 3.752748e-06
-1.000000e-10, 8.918732e-11, 1.221875e-06
-1.000000e-11, 9.578116e-12, 4.029476e-07
-1.000000e-12, 6.572520e-13, 1.056303e-07
-1.000000e-13, 7.105427e-14, 3.439275e-08
-1.000000e-14, 7.105427e-15, 1.134196e-08
-1.000000e-15, 0.000000e+00, 4.645668e-09
+1.000000e-02, 8.958678e-01, 3.007916e-01
+1.000000e-03, 1.230687e-03, 1.425661e-02
+1.000000e-04, 1.323056e-04, 4.747179e-03
+1.000000e-05, 1.420808e-05, 1.541060e-03
+1.000000e-06, 1.525602e-06, 5.087152e-04
+1.000000e-07, 1.638105e-07, 1.655817e-04
+1.000000e-08, 1.758902e-08, 5.461100e-05
+1.000000e-09, 1.208709e-09, 1.431567e-05
+1.000000e-10, 1.297840e-10, 4.661076e-06
+1.000000e-11, 1.393552e-11, 1.537124e-06
+1.000000e-12, 1.496225e-12, 5.004802e-07
+1.000000e-13, 1.607603e-13, 1.650473e-07
+1.000000e-14, 1.723066e-14, 5.373867e-08
+1.000000e-15, 1.065814e-15, 1.408727e-08

+ 9 - 9
Lab6/lab_6_error.csv

@@ -1,9 +1,9 @@
-1.000000e-02, 6.816769e-13, 1.085224e-06
-1.000000e-01, 2.849831e-12, 7.811492e-07
-1.000000e+00, 5.315943e-10, 2.983091e-06
-1.000000e+01, 2.993943e-10, 7.758976e-07
-1.000000e+02, 9.895302e-08, 3.902251e-06
-1.000000e+03, 6.206810e-05, 3.959884e-05
-1.000000e+04, 1.937384e-06, 1.755551e-06
-1.000000e+05, 4.202547e-05, 2.971704e-06
-1.000000e+06, 9.017307e-04, 4.085244e-06
+1.000000e-02, 8.756166e-02, 3.185026e-01
+1.000000e-01, 8.997099e-01, 3.052316e-01
+1.000000e+00, 5.315943e-10, 4.902696e+00
+1.000000e+01, 1.095544e-07, 7.361105e+01
+1.000000e+02, 1.108531e-03, 5.769179e+02
+1.000000e+03, 1.464156e+00, 5.164138e+03
+1.000000e+04, 1.163490e-03, 6.948872e+04
+1.000000e+05, 2.895802e-02, 5.506386e+05
+1.000000e+06, 1.766554e+00, 5.348282e+06