Ivan Glagolev 4 months ago
parent
commit
2106493876
14 changed files with 1265 additions and 0 deletions
  1. 297 0
      Lab3/Lab.c
  2. BIN
      Lab3/Nummath.pdf
  3. 11 0
      Lab3/graph1.m
  4. 9 0
      Lab3/graph2.m
  5. 11 0
      Lab3/graphtime.m
  6. 260 0
      Lab3/lab1.c
  7. 264 0
      Lab3/lab2.c
  8. 279 0
      Lab3/lab3.c
  9. 90 0
      Lab3/lab_3.txt
  10. 9 0
      Lab3/lab_3_error.csv
  11. 5 0
      Lab3/lab_3_rnd.csv
  12. 5 0
      Lab3/lab_3_rnd.txt
  13. 9 0
      Lab3/lab_3_time.csv
  14. 16 0
      Lab3/matrix.m

+ 297 - 0
Lab3/Lab.c

@@ -0,0 +1,297 @@
+#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];
+
+// Скалярное произведение
+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 sub(vec v, vec u) {
+    for(int i = 0; i < N; i++) {
+        v[i] -= u[i];
+    }
+}
+
+// Умножение на скаляр
+void mul(vec v, double a) {
+    for(int i = 0; i < N; i++) {
+        v[i] *= a;
+    }
+}
+
+// Умножение матрицы на вектор (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]; 
+        }
+    }
+}
+
+// Умножение матриц (res = m*n)
+void multiply(mat m, mat n, mat res) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            res[i][j] = 0;
+            for(int k = 0; k < N; k++) {
+                res[i][j] += m[i][k] * n[k][j];
+            }
+        }
+    }
+}
+
+// Копирование матрицы (copy = m)
+void copy_mat(mat m, mat copy) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            copy[i][j] = m[i][j];
+        }
+    }
+}
+
+// Получение j-ого столбца матрицы (res = m[*][j])
+void get_column(mat m, int j, vec res) {
+    for(int i = 0; i < N; i++) {
+        res[i] = m[i][j];
+    }
+}
+
+// Получение i-ой строки матрицы (res = m[i][*])
+void get_row(mat m, int i, vec res) {
+    for(int j = 0; j < N; j++) {
+        res[j] = m[i][j];
+    }
+}
+
+// Задание i-ого столбца матрицы (m[*][i] = col)
+void set_column(mat m, int i, vec col) {
+    for(int j = 0; j < N; j++) {
+        m[j][i] = col[j];
+    }
+}
+
+// Нормализация столбцов матрицы
+void normalize(mat m) {
+    vec v;
+    for(int i = 0; i < N; i++) {
+        get_column(m, i, v);
+        double norm = sqrt(dot(v,v));
+        mul(v, 1/norm);
+        set_column(m, i, v);
+    }
+}
+
+// Ортогонализация Грамма-Шмидта
+void ortogonalize(mat m) {
+    vec v;
+    vec u;
+    for(int i = 0; i < N; i++) {
+        get_column(m, i, v);
+        for(int j = 0; j < i; j++) {
+            get_column(m, j, u);
+
+            double c = dot(v, u)/dot(u, u);
+            mul(u, c);
+            sub(v, u);
+        }
+        set_column(m, i, v);
+    }
+    normalize(m);
+}
+
+// QR-разложение (m = q*r)
+void qr_decomposition(mat m, mat q, mat r) {
+    copy_mat(m, q);
+    ortogonalize(q);
+
+    vec v;
+    vec u;
+    for(int j = 0; j < N; j++) {
+        get_column(m, j, v);
+        for(int i = 0; i <= j; i++) {
+            get_column(q, i, u);
+            r[i][j] = dot(v, u);
+        }
+        for(int i = j+1; i < N; i++) r[i][j] = 0;
+    }
+}
+
+// Транспонирование матрицы
+void transpose(mat m) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < i; j++) {
+            double d = m[i][j];
+            m[i][j] = m[j][i];
+            m[j][i] = d;
+        }
+    }
+}
+
+// Обращение верхне-треугольной матрицы (inv = r^{-1}) 
+void inverse_r(mat r, mat inv) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            inv[i][j] = i == j ? 1./r[i][i] : 0;
+        }
+    }
+
+    vec v;
+    vec u;
+    for(int j = 0; j < N; j++) {
+        for(int i = j-1; i >= 0; i--) {
+            get_row(r, i, v);
+            get_column(inv, j, u);
+            inv[i][j] = -dot(v, u)/r[i][i];
+        }
+    }
+}
+
+// Обращение матрицы (inv = m^{-1})
+void inverse(mat m, mat inv) {
+    mat q;
+    mat r;
+    qr_decomposition(m, q, r);
+    mat inv_r;
+    inverse_r(r, inv_r);
+    transpose(q);
+    multiply(inv_r, q, inv);
+}
+
+// Решение СЛАУ методом QR-разложения
+void solve(mat m, vec v, vec sol) {
+    mat inv;
+    inverse(m, inv);
+    apply(inv, v, sol);
+}
+
+// Чтение матрицы из файла
+void mat_from_file(char* filename, mat m) {
+	double d;
+	FILE* f;
+	if ((f = fopen(filename, "r")) == NULL) return;
+	for (int i = 0; i < N; i++) {
+		for (int j = 0; j < N; j++) {
+			fscanf(f, "%lf,", &d);
+			m[i][j] = d;
+		}
+	}
+	fclose(f);
+}
+
+// Красивая печать матрицы
+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");
+}
+
+int main(){
+    // Матрица системы
+    mat m;
+    mat_from_file("lab_3.txt", m);
+    printf("Coefficients: \n");
+    print_mat(m);
+
+    #if 1
+    // Решение по умолчанию (x[i] = 2*i + 1)
+    vec x;
+    for(int i = 0; i < N; i++) {
+        x[i] = 2*i+1;
+    }
+
+    // Свободный столбец уравнения (b = m*x)
+    vec b;
+    apply(m, x, b);
+    printf("Constant terms: \n");
+    print_vec(b);
+
+    // Решение с помощью QR-разложения
+    vec sol;
+    solve(m, b, sol);
+    printf("Solution: \n");
+    print_vec(sol);
+    #endif 
+
+    // Тесты
+    #if 0
+    ortogonalize(m);
+    print_mat(m);
+    for(int i = 0; i < N; i++){
+        for(int j = i; j < N; j++){
+            vec v;
+            vec u;
+            get_column(m, i, v);
+            get_column(m, j, u);
+            printf("%d:%d - %lf\n", i, j, dot(u,v));
+        }
+    }
+    #endif
+
+    #if 0
+    mat q;
+    mat r;
+    qr_decomposition(m, q, r);
+    print_mat(m);
+    print_mat(q);
+    print_mat(r);
+
+    mat inv;
+    inverse_r(r, inv);
+    print_mat(inv);
+    #endif
+
+    #if 0
+    transpose(m);
+    print_mat(m);
+    #endif
+
+    #if 0
+    mat inv;
+    inverse(m, inv);
+    print_mat(inv);
+    #endif
+}

BIN
Lab3/Nummath.pdf


+ 11 - 0
Lab3/graph1.m

@@ -0,0 +1,11 @@
+X = logspace(-16, -1, 16);
+data=csvread('lab_3_error.csv'); % reading csv file 
+X = data(:,1);
+Y = data(:,2); 
+figure;
+loglog(X, Y, '-o');
+grid on;
+legend('Tol(Cond)');
+title("$\bf Tolerance(Condition)$", 'Interpreter','latex');
+xlabel('Condition')
+ylabel('Tolerance')

+ 9 - 0
Lab3/graph2.m

@@ -0,0 +1,9 @@
+Y = readmatrix("lab_3_rnd.txt");
+Y = transpose(Y);
+figure; 
+hold on;
+grid on;
+boxchart(Y, "JitterOutliers","on", "MarkerStyle", ".")
+title("$\bf Error(Fluctuation) \; for \; condition \; 10^0$", 'Interpreter','latex');
+xlabel('Fluct')
+ylabel('Err')

+ 11 - 0
Lab3/graphtime.m

@@ -0,0 +1,11 @@
+X = logspace(-16, -1, 16);
+data=csvread('lab_3_time.csv'); % reading csv file 
+X = data(:,1);
+Y = data(:,2); 
+figure;
+loglog(X, Y, '-o');
+grid on;
+legend('Time(Cond)');
+title("$\bf Time(Condition)$", 'Interpreter','latex');
+xlabel('Condition')
+ylabel('Time')

+ 260 - 0
Lab3/lab1.c

@@ -0,0 +1,260 @@
+#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];
+
+// Скалярное произведение
+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 sub(vec v, vec u) {
+    for(int i = 0; i < N; i++) {
+        v[i] -= u[i];
+    }
+}
+
+// Умножение на скаляр
+void mul(vec v, double a) {
+    for(int i = 0; i < N; i++) {
+        v[i] *= a;
+    }
+}
+
+// Умножение матрицы на вектор (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]; 
+        }
+    }
+}
+
+// Умножение матриц (res = m*n)
+void multiply(mat m, mat n, mat res) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            res[i][j] = 0;
+            for(int k = 0; k < N; k++) {
+                res[i][j] += m[i][k] * n[k][j];
+            }
+        }
+    }
+}
+
+// Копирование матрицы (copy = m)
+void copy_mat(mat m, mat copy) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            copy[i][j] = m[i][j];
+        }
+    }
+}
+
+// Получение j-ого столбца матрицы (res = m[*][j])
+void get_column(mat m, int j, vec res) {
+    for(int i = 0; i < N; i++) {
+        res[i] = m[i][j];
+    }
+}
+
+// Получение i-ой строки матрицы (res = m[i][*])
+void get_row(mat m, int i, vec res) {
+    for(int j = 0; j < N; j++) {
+        res[j] = m[i][j];
+    }
+}
+
+// Задание i-ого столбца матрицы (m[*][i] = col)
+void set_column(mat m, int i, vec col) {
+    for(int j = 0; j < N; j++) {
+        m[j][i] = col[j];
+    }
+}
+
+// Нормализация столбцов матрицы
+void normalize(mat m) {
+    vec v;
+    for(int i = 0; i < N; i++) {
+        get_column(m, i, v);
+        double norm = sqrt(dot(v,v));
+        mul(v, 1/norm);
+        set_column(m, i, v);
+    }
+}
+
+// Ортогонализация Грамма-Шмидта
+void ortogonalize(mat m) {
+    vec v;
+    vec u;
+    for(int i = 0; i < N; i++) {
+        get_column(m, i, v);
+        for(int j = 0; j < i; j++) {
+            get_column(m, j, u);
+
+            double c = dot(v, u)/dot(u, u);
+            mul(u, c);
+            sub(v, u);
+        }
+        set_column(m, i, v);
+    }
+    normalize(m);
+}
+
+// QR-разложение (m = q*r)
+void qr_decomposition(mat m, mat q, mat r) {
+    copy_mat(m, q);
+    ortogonalize(q);
+
+    vec v;
+    vec u;
+    for(int j = 0; j < N; j++) {
+        get_column(m, j, v);
+        for(int i = 0; i <= j; i++) {
+            get_column(q, i, u);
+            r[i][j] = dot(v, u);
+        }
+        for(int i = j+1; i < N; i++) r[i][j] = 0;
+    }
+}
+
+// Транспонирование матрицы
+void transpose(mat m) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < i; j++) {
+            double d = m[i][j];
+            m[i][j] = m[j][i];
+            m[j][i] = d;
+        }
+    }
+}
+
+// Обращение верхне-треугольной матрицы (inv = r^{-1}) 
+void inverse_r(mat r, mat inv) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            inv[i][j] = i == j ? 1./r[i][i] : 0;
+        }
+    }
+
+    vec v;
+    vec u;
+    for(int j = 0; j < N; j++) {
+        for(int i = j-1; i >= 0; i--) {
+            get_row(r, i, v);
+            get_column(inv, j, u);
+            inv[i][j] = -dot(v, u)/r[i][i];
+        }
+    }
+}
+
+// Обращение матрицы (inv = m^{-1})
+void inverse(mat m, mat inv) {
+    mat q;
+    mat r;
+    qr_decomposition(m, q, r);
+    mat inv_r;
+    inverse_r(r, inv_r);
+    transpose(q);
+    multiply(inv_r, q, inv);
+}
+
+// Решение СЛАУ методом QR-разложения
+void solve(mat m, vec v, vec sol) {
+    mat inv;
+    inverse(m, inv);
+    apply(inv, v, sol);
+}
+
+// Чтение матрицы из файла
+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 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");
+}
+
+//Оценка погрешности
+double error(mat m){
+    vec x;
+    for(int i = 0; i < N; i++) {
+        x[i] = 2*i+1;
+    }
+    vec b;
+    apply(m, x, b);
+    vec sol;
+    solve(m, b, sol);
+    double maxi = 0;
+    for (int i = 0; i < N; i++){
+        maxi = fmax(maxi, fabs(x[i]-sol[i]));
+    }
+    return maxi;
+}
+
+int main(){
+    // Матрица системы
+    FILE* f;
+	if ((f = fopen("lab_3.txt", "r")) == NULL) return 1;
+    mat m;
+    FILE* file;
+    if ((file = fopen("lab_3_error.csv", "w+")) == NULL) return 1;
+    for (int i = 0; i < 9; i++) {
+        mat_from_file(f, m);
+        double solu = error(m);
+        fprintf(file, "%e, %e\n", pow(10,i), solu);
+    }
+    fclose(f);
+    fclose(file);
+}

+ 264 - 0
Lab3/lab2.c

@@ -0,0 +1,264 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include<math.h>
+#include<time.h>
+
+// Необязательный флаг для дебага (можно удалить)
+#define DEBUG 0
+
+// Фиксированная размерность матрицы (обрабатывается препроцессором, просто alias)
+#define N 10
+
+// Тип вектора
+typedef double vec[N];
+
+// Тип матрицы
+typedef double mat[N][N];
+
+// Скалярное произведение
+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 sub(vec v, vec u) {
+    for(int i = 0; i < N; i++) {
+        v[i] -= u[i];
+    }
+}
+
+// Умножение на скаляр
+void mul(vec v, double a) {
+    for(int i = 0; i < N; i++) {
+        v[i] *= a;
+    }
+}
+
+// Умножение матрицы на вектор (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]; 
+        }
+    }
+}
+
+// Умножение матриц (res = m*n)
+void multiply(mat m, mat n, mat res) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            res[i][j] = 0;
+            for(int k = 0; k < N; k++) {
+                res[i][j] += m[i][k] * n[k][j];
+            }
+        }
+    }
+}
+
+// Копирование матрицы (copy = m)
+void copy_mat(mat m, mat copy) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            copy[i][j] = m[i][j];
+        }
+    }
+}
+
+// Получение j-ого столбца матрицы (res = m[*][j])
+void get_column(mat m, int j, vec res) {
+    for(int i = 0; i < N; i++) {
+        res[i] = m[i][j];
+    }
+}
+
+// Получение i-ой строки матрицы (res = m[i][*])
+void get_row(mat m, int i, vec res) {
+    for(int j = 0; j < N; j++) {
+        res[j] = m[i][j];
+    }
+}
+
+// Задание i-ого столбца матрицы (m[*][i] = col)
+void set_column(mat m, int i, vec col) {
+    for(int j = 0; j < N; j++) {
+        m[j][i] = col[j];
+    }
+}
+
+// Нормализация столбцов матрицы
+void normalize(mat m) {
+    vec v;
+    for(int i = 0; i < N; i++) {
+        get_column(m, i, v);
+        double norm = sqrt(dot(v,v));
+        mul(v, 1/norm);
+        set_column(m, i, v);
+    }
+}
+
+// Ортогонализация Грамма-Шмидта
+void ortogonalize(mat m) {
+    vec v;
+    vec u;
+    for(int i = 0; i < N; i++) {
+        get_column(m, i, v);
+        for(int j = 0; j < i; j++) {
+            get_column(m, j, u);
+
+            double c = dot(v, u)/dot(u, u);
+            mul(u, c);
+            sub(v, u);
+        }
+        set_column(m, i, v);
+    }
+    normalize(m);
+}
+
+// QR-разложение (m = q*r)
+void qr_decomposition(mat m, mat q, mat r) {
+    copy_mat(m, q);
+    ortogonalize(q);
+
+    vec v;
+    vec u;
+    for(int j = 0; j < N; j++) {
+        get_column(m, j, v);
+        for(int i = 0; i <= j; i++) {
+            get_column(q, i, u);
+            r[i][j] = dot(v, u);
+        }
+        for(int i = j+1; i < N; i++) r[i][j] = 0;
+    }
+}
+
+// Транспонирование матрицы
+void transpose(mat m) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < i; j++) {
+            double d = m[i][j];
+            m[i][j] = m[j][i];
+            m[j][i] = d;
+        }
+    }
+}
+
+// Обращение верхне-треугольной матрицы (inv = r^{-1}) 
+void inverse_r(mat r, mat inv) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            inv[i][j] = i == j ? 1./r[i][i] : 0;
+        }
+    }
+
+    vec v;
+    vec u;
+    for(int j = 0; j < N; j++) {
+        for(int i = j-1; i >= 0; i--) {
+            get_row(r, i, v);
+            get_column(inv, j, u);
+            inv[i][j] = -dot(v, u)/r[i][i];
+        }
+    }
+}
+
+// Обращение матрицы (inv = m^{-1})
+void inverse(mat m, mat inv) {
+    mat q;
+    mat r;
+    qr_decomposition(m, q, r);
+    mat inv_r;
+    inverse_r(r, inv_r);
+    transpose(q);
+    multiply(inv_r, q, inv);
+}
+
+// Решение СЛАУ методом QR-разложения
+void solve(mat m, vec v, vec sol) {
+    mat inv;
+    inverse(m, inv);
+    apply(inv, v, sol);
+}
+
+// Чтение матрицы из файла
+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 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");
+}
+
+//Оценка погрешности
+double error(mat m){
+    vec x;
+    for(int i = 0; i < N; i++) {
+        x[i] = 2*i+1;
+    }
+    vec b;
+    apply(m, x, b);
+    vec sol;
+    solve(m, b, sol);
+    double maxi = 0;
+    for (int i = 0; i < N; i++){
+        maxi = fmax(maxi, fabs(x[i]-sol[i]));
+    }
+    return maxi;
+}
+
+int main(){
+    // Матрица системы
+    FILE* f;
+	if ((f = fopen("lab_3.txt", "r")) == NULL) return 1;
+    mat m;
+    FILE* file;
+    if ((file = fopen("lab_3_time.csv", "w+")) == NULL) return 1;
+    for (int i = 0; i < 9; i++) {
+        mat_from_file(f, m);
+        clock_t begin = clock();
+        double solu = error(m);
+        clock_t end = clock();
+		fprintf(file, "%lf, %e\n", pow(10, i), (float)(end - begin) / CLOCKS_PER_SEC);
+        printf("%e, %e\n", begin, end);
+    }
+    fclose(f);
+    fclose(file);
+}

+ 279 - 0
Lab3/lab3.c

@@ -0,0 +1,279 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include<math.h>
+#include<time.h>
+
+// Необязательный флаг для дебага (можно удалить)
+#define DEBUG 0
+
+// Фиксированная размерность матрицы (обрабатывается препроцессором, просто alias)
+#define N 10
+
+// Тип вектора
+typedef double vec[N];
+
+// Тип матрицы
+typedef double mat[N][N];
+
+// Скалярное произведение
+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 sub(vec v, vec u) {
+    for(int i = 0; i < N; i++) {
+        v[i] -= u[i];
+    }
+}
+
+// Умножение на скаляр
+void mul(vec v, double a) {
+    for(int i = 0; i < N; i++) {
+        v[i] *= a;
+    }
+}
+
+// Умножение матрицы на вектор (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]; 
+        }
+    }
+}
+
+// Умножение матриц (res = m*n)
+void multiply(mat m, mat n, mat res) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            res[i][j] = 0;
+            for(int k = 0; k < N; k++) {
+                res[i][j] += m[i][k] * n[k][j];
+            }
+        }
+    }
+}
+
+// Копирование матрицы (copy = m)
+void copy_mat(mat m, mat copy) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            copy[i][j] = m[i][j];
+        }
+    }
+}
+
+// Получение j-ого столбца матрицы (res = m[*][j])
+void get_column(mat m, int j, vec res) {
+    for(int i = 0; i < N; i++) {
+        res[i] = m[i][j];
+    }
+}
+
+// Получение i-ой строки матрицы (res = m[i][*])
+void get_row(mat m, int i, vec res) {
+    for(int j = 0; j < N; j++) {
+        res[j] = m[i][j];
+    }
+}
+
+// Задание i-ого столбца матрицы (m[*][i] = col)
+void set_column(mat m, int i, vec col) {
+    for(int j = 0; j < N; j++) {
+        m[j][i] = col[j];
+    }
+}
+
+// Нормализация столбцов матрицы
+void normalize(mat m) {
+    vec v;
+    for(int i = 0; i < N; i++) {
+        get_column(m, i, v);
+        double norm = sqrt(dot(v,v));
+        mul(v, 1/norm);
+        set_column(m, i, v);
+    }
+}
+
+// Ортогонализация Грамма-Шмидта
+void ortogonalize(mat m) {
+    vec v;
+    vec u;
+    for(int i = 0; i < N; i++) {
+        get_column(m, i, v);
+        for(int j = 0; j < i; j++) {
+            get_column(m, j, u);
+
+            double c = dot(v, u)/dot(u, u);
+            mul(u, c);
+            sub(v, u);
+        }
+        set_column(m, i, v);
+    }
+    normalize(m);
+}
+
+// QR-разложение (m = q*r)
+void qr_decomposition(mat m, mat q, mat r) {
+    copy_mat(m, q);
+    ortogonalize(q);
+
+    vec v;
+    vec u;
+    for(int j = 0; j < N; j++) {
+        get_column(m, j, v);
+        for(int i = 0; i <= j; i++) {
+            get_column(q, i, u);
+            r[i][j] = dot(v, u);
+        }
+        for(int i = j+1; i < N; i++) r[i][j] = 0;
+    }
+}
+
+// Транспонирование матрицы
+void transpose(mat m) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < i; j++) {
+            double d = m[i][j];
+            m[i][j] = m[j][i];
+            m[j][i] = d;
+        }
+    }
+}
+
+// Обращение верхне-треугольной матрицы (inv = r^{-1}) 
+void inverse_r(mat r, mat inv) {
+    for(int i = 0; i < N; i++) {
+        for(int j = 0; j < N; j++) {
+            inv[i][j] = i == j ? 1./r[i][i] : 0;
+        }
+    }
+
+    vec v;
+    vec u;
+    for(int j = 0; j < N; j++) {
+        for(int i = j-1; i >= 0; i--) {
+            get_row(r, i, v);
+            get_column(inv, j, u);
+            inv[i][j] = -dot(v, u)/r[i][i];
+        }
+    }
+}
+
+// Обращение матрицы (inv = m^{-1})
+void inverse(mat m, mat inv) {
+    mat q;
+    mat r;
+    qr_decomposition(m, q, r);
+    mat inv_r;
+    inverse_r(r, inv_r);
+    transpose(q);
+    multiply(inv_r, q, inv);
+}
+
+// Решение СЛАУ методом QR-разложения
+void solve(mat m, vec v, vec sol) {
+    mat inv;
+    inverse(m, inv);
+    apply(inv, v, sol);
+}
+
+// Чтение матрицы из файла
+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 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");
+}
+
+//Рандом в диапозоне
+double random(double min, double max) {
+	double range = (max - min);
+	double div = RAND_MAX / range;
+	return min + (rand() / div);
+}
+
+// Случайное возмущение
+double error(mat m, double eps){
+    vec x;
+    for(int i = 0; i < N; i++) {
+        x[i] = 2*i+1;
+    }
+    vec b;
+    apply(m, x, b);
+    double rnd = random(-1, 1);
+    for (int k = 0; k < N; k++) {
+        b[k] = b[k] +  rnd * b[k] * eps * 0.01;
+    }
+    vec sol;
+    solve(m, b, sol);
+    double maxi = 0;
+    for (int i = 0; i < N; i++){
+        maxi = fmax(maxi, fabs(x[i]-sol[i]));
+    }
+    double sum = 0;
+    for(int i = 0; i < N; i++) {
+        sum+= x[i]*x[i];
+    }
+    return maxi/sqrt(sum);
+}
+
+int main(){
+    // Матрица системы
+    FILE* f;
+	if ((f = fopen("lab_3.txt", "r")) == NULL) return 1;
+    mat m;
+    FILE* file;
+    if ((file = fopen("lab_3_rnd.txt", "w+")) == NULL) return 1;
+    mat_from_file(f, m);
+    for (int i = 1; i < 6; i++) {
+        for (int j = 0; j < 100; j++) {
+            double solu = error(m, i);
+            fprintf(file, "%e ", solu);
+        }
+        fprintf(file, "\n");
+    }
+    fclose(f);
+    fclose(file);
+}

+ 90 - 0
Lab3/lab_3.txt

@@ -0,0 +1,90 @@
+0.3344 0.3633 -0.4437 0.4366 0.0939 -0.2419 -0.0255 -0.1120 0.4171 0.3378
+-0.5318 0.3624 0.3263 -0.0915 0.3091 0.1342 -0.2456 0.2576 0.3984 0.2686
+0.0898 -0.1006 0.3844 0.6067 0.0839 0.1012 0.0179 0.0410 0.3176 -0.5881
+0.1815 -0.3089 -0.2746 -0.3361 -0.0023 0.4342 0.3122 0.2829 0.5620 -0.0386
+0.1867 -0.1631 0.3489 0.3046 -0.5167 0.1765 -0.0062 0.3602 -0.0766 0.5388
+-0.0368 0.4275 0.3181 -0.1206 -0.2448 0.0086 0.7089 -0.3536 0.1085 0.0268
+0.1535 0.1651 -0.0512 0.1788 0.3415 0.7771 -0.0206 -0.2701 -0.3193 0.1368
+0.5990 -0.1293 0.4973 -0.3230 0.3850 -0.1979 -0.1372 -0.1614 0.1089 0.1698
+0.2702 0.4173 -0.0265 -0.0350 0.2336 -0.0907 0.2538 0.6958 -0.3246 -0.1850
+-0.2700 -0.4513 -0.0035 0.2742 0.4921 -0.2053 0.5049 0.0396 -0.1174 0.3061
+0.8511 1.4506 0.8485 1.1495 0.2478 1.0158 0.5023 1.5730 1.4621 0.9542
+1.2162 0.7198 0.7569 1.1321 0.4827 1.4935 1.1622 1.5233 0.6873 0.8586
+0.6602 1.3835 0.5740 1.1356 1.3307 0.9354 0.8853 1.3729 0.7626 1.1437
+0.7568 1.4374 0.7308 0.9751 0.5077 0.8214 1.5315 0.9498 1.0691 0.3530
+1.3446 1.2185 0.8907 0.8423 0.4978 0.4392 0.4585 0.8305 0.3107 0.4974
+0.8124 0.8205 1.3562 1.7602 0.8606 0.6605 0.9887 1.4482 1.1079 0.6449
+1.2504 1.0351 0.4562 1.0591 0.7018 0.3246 1.1763 1.9861 1.0855 0.7180
+0.6452 0.9673 1.3321 0.4445 0.4795 0.5451 1.1059 1.4177 0.7237 1.0914
+1.1098 0.8781 1.0112 0.5209 1.1343 0.9860 0.7303 1.3365 1.3289 0.3442
+1.5876 1.1087 0.9877 1.3333 0.9167 0.8546 1.3572 1.2016 1.6756 1.5382
+7.3495 11.9116 14.9138 9.2185 13.1552 13.9996 13.9328 10.9523 10.6786 12.4063
+3.7629 6.4824 8.1580 5.1111 7.9272 7.0814 7.4429 5.5239 5.7220 7.1164
+6.1570 10.7174 12.1189 7.2931 11.3994 11.3906 11.3034 8.8270 8.3881 9.8196
+5.0315 7.3583 9.1029 6.0745 8.3150 7.8531 8.1900 6.8721 6.3519 7.1671
+5.6645 9.2714 11.7943 7.1806 11.1637 10.9938 10.8865 9.1939 7.6442 9.6000
+7.1104 11.0795 12.8278 8.2633 12.2845 12.2123 12.8654 10.0951 9.0106 11.6583
+5.3622 9.9958 11.7908 7.6019 10.2991 10.4585 10.8125 8.8785 7.6913 9.9374
+6.6198 11.4681 13.4550 9.2365 12.9235 12.8518 13.6199 10.2508 9.5961 11.2059
+6.9880 12.3389 14.1763 9.1661 13.7206 13.3818 13.6519 11.5665 10.7541 12.3107
+5.6384 9.5519 11.7861 6.8031 10.5928 10.0743 11.4649 8.8255 8.1317 9.4362
+75.3392 100.1096 90.2279 92.5349 78.8656 64.9307 85.8802 93.7263 77.4174 73.1403
+104.3719 137.2291 124.8459 128.0477 108.7538 89.7835 117.5039 128.9001 105.8322 100.6381
+91.0732 119.9911 109.3819 111.9128 94.2012 78.5240 103.1236 112.2743 93.1558 88.4082
+63.9402 84.8632 76.3467 79.4823 66.7333 55.1737 72.6307 78.8141 65.2456 62.0239
+116.0918 152.9863 137.8903 141.9169 120.1098 100.0418 130.5692 142.9451 117.7463 112.5068
+92.0057 121.9619 110.3404 113.0977 96.2486 79.6722 103.5783 113.4137 94.4111 89.3800
+97.4910 129.7547 117.6201 120.4503 102.1504 84.6123 110.8054 121.2083 99.5232 95.6738
+73.6158 96.5670 87.6675 90.0192 76.8479 62.9534 83.1551 90.2371 74.8303 71.7214
+89.0765 117.7119 106.7089 109.3283 93.0832 77.6812 101.2825 109.8017 90.7500 86.3894
+87.1149 115.2106 104.1752 106.3016 90.3371 74.5967 98.2471 106.7133 88.1224 84.0192
+806.3248 872.3826 820.9512 931.3624 646.0835 1062.7105 785.7564 751.4783 643.7684 783.4645
+1148.7966 1243.2648 1169.2198 1328.2547 920.1284 1514.3794 1119.4248 1071.6361 916.7675 1116.7665
+824.0340 891.1714 838.0662 951.8315 659.5226 1085.0621 802.5597 768.2540 657.9862 801.0183
+1140.1884 1234.4405 1160.8709 1318.1591 913.2104 1502.7384 1110.9249 1063.8432 910.9795 1107.8557
+960.3821 1039.2759 978.3640 1110.9031 769.2471 1266.4466 936.5351 896.0969 767.6253 934.0590
+911.3321 985.2192 927.4235 1052.6868 729.2816 1200.8920 887.5160 850.1691 727.4001 885.0673
+897.1217 971.3200 913.9280 1036.9317 718.7069 1183.0885 874.0543 837.4488 716.6906 872.8402
+886.9322 960.2506 902.8019 1024.8750 709.7672 1169.4028 864.8695 827.4706 708.3361 862.1799
+1059.5473 1146.3585 1078.7632 1224.3810 847.5839 1395.9815 1031.8157 987.6004 845.6553 1029.5894
+1127.2067 1219.8861 1148.0965 1302.8050 902.6656 1485.1632 1098.8318 1051.8733 899.7738 1095.6973
+12297.8016 10048.2946 11332.6820 9577.6572 10016.8382 10691.0788 12203.2811 11346.9002 9904.2825 7738.3639
+10098.6997 8251.8236 9306.1674 7865.4000 8225.9401 8780.0036 10020.6257 9317.4457 8133.2139 6353.9544
+12921.9560 10558.2317 11907.2271 10064.5653 10525.4282 11234.2783 12823.0188 11923.2111 10407.2010 8130.4166
+12339.2819 10081.8974 11370.5923 9610.4352 10051.4064 10727.3507 12244.0725 11385.2234 9938.5866 7764.1476
+8708.3958 7114.8499 8024.7758 6782.1939 7092.5523 7571.1405 8640.9919 8034.8875 7013.9085 5479.2480
+9595.2145 7839.5697 8841.4358 7473.1363 7814.9084 8340.7850 9520.4424 8852.7223 7727.4187 6036.8177
+13589.5911 11103.1305 12522.4831 10583.3942 11069.0080 11813.8909 13484.9705 12537.9708 10944.7430 8549.8037
+14897.1169 12171.9616 13726.6597 11602.1343 12133.7171 12950.8644 14782.2116 13744.1940 11998.0423 9373.4282
+12417.7676 10146.8528 11442.7411 9671.0181 10114.4790 10795.4821 12322.0659 11457.7915 10001.6746 7812.9811
+6783.0769 5541.7266 6249.6225 5282.0186 5524.7929 5896.7245 6729.9699 6258.3133 5462.2929 4267.5979
+147307.1092 109495.7294 146067.7332 150767.1131 102474.7062 117056.5358 164762.8187 151018.5005 111322.7377 149029.6857
+126650.0793 94141.3938 125584.5311 129624.9820 88105.4096 100641.0720 141657.7938 129841.3145 95712.6976 128131.4381
+125352.1223 93175.8689 124296.9616 128296.9008 87201.2812 99609.7479 140205.5796 128510.4104 94731.6157 126818.1996
+110775.4706 82340.8113 109843.5096 113377.2787 77061.0431 88026.0121 123902.2539 113566.2219 83715.7116 112070.2628
+65120.4801 48405.2020 64572.0741 66650.4367 45301.3388 51746.7915 72837.2057 66760.5311 49212.5825 65881.9580
+80854.0795 60100.2568 80173.8526 82753.9955 56246.9945 64250.4815 90436.3326 82891.8592 61103.8917 81800.1046
+94794.5355 70462.9467 93997.9417 97022.3150 65944.5611 75328.1540 106027.9903 97183.1428 71639.0083 95903.5191
+86383.6212 64210.0547 85656.5988 88412.3170 60093.0754 68644.0892 96619.8269 88559.1525 65282.3751 87393.9332
+127369.5204 94674.9901 126297.8087 130361.6679 88605.6719 101212.9660 142462.2640 130578.2587 96255.8750 128858.5942
+84665.2359 62932.7610 83953.5958 86654.3347 58897.9936 67278.3200 94698.3974 86798.6291 63983.5071 85656.3028
+1315732.1581 635857.1031 903614.0843 1131501.6119 982295.4502 513368.6173 883456.2728 976892.8269 1050767.3573 690126.3618
+1888732.0632 912770.8958 1297137.0861 1624268.8116 1410083.6785 736939.4653 1268199.2354 1402328.7893 1508374.8355 990674.9219
+1142593.6247 552183.6339 784706.7503 982606.4878 853034.5546 445813.4798 767201.3031 848343.6456 912495.9432 599312.4458
+1426484.5613 689379.8024 979676.7281 1226746.7615 1064981.0889 556581.2636 957821.6233 1059123.4340 1139215.4812 748217.9035
+1020318.8668 493091.0257 700730.4936 877451.5115 761746.3272 398104.3089 685098.8315 757556.6647 814844.0726 535176.4521
+1143378.9877 552562.7453 785246.6942 983281.2521 853620.5319 446120.4726 767728.4274 848925.7841 913122.8630 599724.4214
+1406526.4920 679734.6612 965969.1295 1209582.7468 1050080.7679 548794.7133 944419.7557 1044305.1799 1123276.5765 737749.8284
+1577237.6681 762234.1625 1083209.9047 1356390.6566 1177530.0889 615402.0463 1059045.6245 1171053.3699 1259610.6240 827290.7592
+1289302.9963 623084.2468 885463.5175 1108772.4226 962564.8055 503056.4137 865709.9669 957270.4937 1029660.1166 676263.4936
+1615742.5856 780843.1604 1109654.4999 1389504.1317 1206277.1405 630425.1127 1084899.2079 1199641.7087 1290361.0564 847487.7317
+10208412.5291 8265886.0152 9590578.1548 9056608.9778 14101882.5159 8989183.7432 11110674.0831 11188682.1038 9424209.1614 10156522.7572
+12728890.1729 10306749.7623 11958510.9214 11292704.8609 17583666.3978 11208630.4830 13853922.0817 13951189.5968 11751065.2671 12664188.5429
+9860891.7237 7984493.4838 9264089.1856 8748298.1113 13621818.2866 8683167.5732 10732437.9459 10807790.2853 9103384.1695 9810768.0595
+7046632.5627 5705750.9704 6620156.2738 6251569.0407 9734206.0552 6205026.6146 7669443.8951 7723289.9955 6505315.1442 7010814.0814
+12998348.6803 10524934.8866 12211661.9930 11531760.9390 17955897.0239 11445907.4302 14147197.8243 14246524.6028 11999824.5670 12932278.6338
+9612735.2600 7783558.9933 9030952.2024 8528141.6606 13279016.0029 8464650.4870 10462349.1500 10535804.4856 8874291.6362 9563872.8881
+9231450.8588 7474827.0295 8672743.6561 8189877.2654 12752309.1900 8128903.7543 10047365.2819 10117907.0458 8522296.5668 9184526.5834
+7931800.5553 6422483.1040 7451751.6732 7036865.3480 10956976.1316 6984476.3201 8632846.2717 8693457.7127 7322485.1318 7891482.7960
+7257343.3457 5876366.3606 6818113.5387 6438506.0454 10025281.6810 6390571.7792 7898778.1083 7954234.8255 6699840.1007 7220454.4330
+10077701.5834 8160047.2763 9467777.5789 8940646.1408 13921319.3877 8874084.2430 10968411.0103 11045419.0157 9303538.8405 10026476.3998

+ 9 - 0
Lab3/lab_3_error.csv

@@ -0,0 +1,9 @@
+1.000000e+00, 7.105427e-15
+1.000000e+01, 5.684342e-14
+1.000000e+02, 7.844392e-12
+1.000000e+03, 1.289663e-09
+1.000000e+04, 6.867776e-08
+1.000000e+05, 9.849624e-06
+1.000000e+06, 1.188390e-03
+1.000000e+07, 6.505816e-02
+1.000000e+08, 1.021740e+01

+ 5 - 0
Lab3/lab_3_rnd.csv

@@ -0,0 +1,5 @@
+1.895245e-01, 2.416242e-02, 1.165444e-01, 1.173214e-01, 3.230354e-02, 7.648244e-03, 5.688925e-02, 1.504657e-01, 1.226792e-01, 9.370983e-02, 1.238389e-01, 1.363985e-01, 7.999054e-02, 5.143284e-03, 7.448195e-02, 1.843059e-01, 1.552669e-01, 5.150822e-02, 1.340211e-01, 1.269585e-01, 1.856395e-01, 2.063692e-02, 1.447484e-01, 1.882257e-01, 1.866137e-01, 4.640553e-02, 1.203192e-02, 2.705008e-02, 3.867031e-02, 4.072298e-02, 1.268310e-01, 6.195715e-02, 1.870022e-02, 5.619343e-02, 1.683251e-01, 4.092013e-02, 1.076611e-01, 1.149904e-01, 7.555467e-03, 7.525895e-02, 1.428697e-01, 8.613697e-02, 1.732423e-01, 1.617728e-01, 1.495437e-02, 1.359114e-01, 1.440931e-02, 1.005753e-01, 1.376510e-01, 1.103516e-01, 
+2.125388e-01, 2.611768e-01, 3.775646e-01, 3.797681e-01, 8.473952e-02, 8.174749e-02, 1.776782e-01, 1.540666e-01, 2.585095e-01, 3.619550e-01, 9.434187e-02, 3.096060e-01, 1.346764e-01, 3.372765e-01, 3.733201e-01, 3.182806e-01, 1.703256e-01, 1.725987e-01, 6.681051e-02, 1.452992e-01, 2.565844e-01, 1.721348e-01, 1.144627e-02, 2.239271e-01, 1.852394e-01, 2.397107e-02, 3.194983e-02, 3.413587e-01, 1.857729e-01, 2.977074e-01, 7.527635e-02, 8.722129e-02, 1.786059e-01, 8.281442e-02, 5.502792e-02, 1.053822e-01, 2.648183e-01, 2.089206e-01, 5.688345e-02, 2.301895e-01, 1.300027e-02, 3.723923e-01, 1.911771e-01, 1.173736e-01, 2.515744e-01, 1.195538e-01, 6.158025e-03, 3.317100e-01, 1.518168e-01, 3.653066e-03, 
+4.018546e-01, 5.125251e-01, 4.086041e-01, 4.618345e-01, 2.198972e-01, 2.245244e-01, 8.372478e-02, 4.897717e-01, 5.319385e-01, 2.088336e-01, 3.953139e-01, 4.300702e-01, 3.667156e-01, 9.353587e-02, 3.518598e-01, 3.672027e-01, 3.616013e-01, 2.819819e-02, 3.926698e-01, 4.470656e-03, 2.644993e-01, 1.076263e-01, 2.512787e-01, 7.836695e-02, 2.077551e-01, 2.916712e-01, 2.529835e-01, 2.816340e-02, 4.297571e-01, 1.506977e-01, 3.815366e-01, 5.299902e-01, 1.939604e-02, 1.858019e-01, 8.410749e-02, 4.506665e-01, 5.122468e-01, 4.803781e-01, 5.648335e-02, 1.755733e-01, 3.223395e-02, 1.425217e-01, 3.955574e-01, 2.087640e-01, 5.004700e-02, 2.600461e-01, 5.505866e-01, 2.305084e-01, 2.726753e-01, 7.669698e-02, 
+4.620954e-01, 3.971984e-01, 5.159520e-01, 1.555626e-01, 1.368450e-03, 5.930491e-01, 7.182507e-01, 7.518357e-01, 1.103342e-01, 6.832276e-01, 4.761742e-02, 4.650179e-01, 5.214258e-01, 1.926731e-01, 2.395715e-01, 4.592657e-01, 5.200806e-01, 5.725455e-01, 5.929099e-01, 3.695511e-01, 2.826197e-01, 6.704245e-01, 3.251576e-01, 2.488028e-01, 5.468001e-01, 3.542894e-01, 5.086227e-01, 3.161583e-01, 1.523618e-01, 3.757671e-01, 3.758599e-01, 5.403986e-01, 7.575414e-01, 6.672701e-01, 4.654817e-01, 5.359917e-01, 4.399219e-01, 5.842817e-01, 8.087771e-02, 7.383367e-01, 5.870650e-01, 6.914151e-02, 3.833747e-01, 2.829444e-01, 6.603351e-02, 6.476943e-01, 9.618580e-02, 4.530497e-01, 2.982525e-01, 3.186633e-01, 
+1.202902e-01, 5.083850e-01, 1.479492e-01, 6.189917e-02, 2.444945e-01, 6.456359e-01, 7.856990e-03, 8.797800e-01, 3.719459e-01, 8.071245e-01, 5.891003e-01, 3.116993e-01, 6.111347e-01, 9.408383e-01, 8.086032e-02, 9.462310e-01, 7.647374e-01, 2.378262e-01, 7.706519e-01, 1.183187e-01, 8.198813e-01, 8.579775e-01, 7.497772e-01, 3.989669e-01, 5.181265e-01, 5.112262e-01, 1.696356e-01, 5.662542e-01, 2.433348e-01, 1.978744e-01, 9.193548e-02, 6.392865e-02, 1.858715e-01, 2.559755e-01, 6.741066e-01, 6.247032e-01, 2.370724e-01, 4.197256e-01, 1.249290e-01, 2.372463e-01, 5.998856e-01, 4.520234e-01, 1.047502e-01, 7.696661e-01, 4.885540e-01, 5.910138e-01, 1.989761e-01, 3.771645e-01, 1.607639e-01, 2.825327e-01, 

+ 5 - 0
Lab3/lab_3_rnd.txt

@@ -0,0 +1,5 @@
+5.196843e-03 6.625438e-04 3.195697e-03 3.217002e-03 8.857767e-04 2.097181e-04 1.559927e-03 4.125834e-03 3.363916e-03 2.569563e-03 3.395716e-03 3.740105e-03 2.193375e-03 1.410310e-04 2.042327e-03 5.053745e-03 4.257484e-03 1.412377e-03 3.674916e-03 3.481257e-03 5.090314e-03 5.658731e-04 3.969062e-03 5.161227e-03 5.117026e-03 1.272459e-03 3.299204e-04 7.417247e-04 1.060356e-03 1.116642e-03 3.477759e-03 1.698891e-03 5.127679e-04 1.540848e-03 4.615547e-03 1.122047e-03 2.952112e-03 3.153085e-03 2.071741e-04 2.063632e-03 3.917547e-03 2.361912e-03 4.750377e-03 4.435879e-03 4.100553e-04 3.726749e-03 3.951095e-04 2.757817e-03 3.774449e-03 3.025887e-03 2.913953e-03 3.580789e-03 5.176491e-03 5.206701e-03 1.161797e-03 1.120775e-03 2.436005e-03 2.112286e-03 3.544220e-03 4.962480e-03 1.293447e-03 4.244764e-03 1.846441e-03 4.624133e-03 5.118298e-03 4.363694e-03 2.335201e-03 2.366364e-03 9.159863e-04 1.992083e-03 3.517826e-03 2.360004e-03 1.569308e-04 3.070088e-03 2.539672e-03 3.286484e-04 4.380389e-04 4.680100e-03 2.546986e-03 4.081632e-03 1.032055e-03 1.195822e-03 2.448725e-03 1.135403e-03 7.544445e-04 1.444813e-03 3.630715e-03 2.864345e-03 7.798842e-04 3.155947e-03 1.782365e-04 5.105578e-03 2.621079e-03 1.609217e-03 3.449139e-03 1.639108e-03 8.442783e-05 4.547814e-03 2.081440e-03 5.008431e-05 
+7.346016e-03 9.369104e-03 7.469398e-03 8.442465e-03 4.019782e-03 4.104369e-03 1.530513e-03 8.953166e-03 9.723987e-03 3.817537e-03 7.226450e-03 7.861805e-03 6.703665e-03 1.709862e-03 6.432097e-03 6.712569e-03 6.610174e-03 5.154708e-04 7.178114e-03 8.172487e-05 4.835123e-03 1.967439e-03 4.593446e-03 1.432570e-03 3.797821e-03 5.331832e-03 4.624610e-03 5.148349e-04 7.856081e-03 2.754796e-03 6.974597e-03 9.688372e-03 3.545651e-04 3.396511e-03 1.537509e-03 8.238312e-03 9.364016e-03 8.781448e-03 1.032532e-03 3.209529e-03 5.892458e-04 2.605338e-03 7.230902e-03 3.816265e-03 9.148733e-04 4.753716e-03 1.006488e-02 4.213760e-03 4.984581e-03 1.402043e-03 6.335426e-03 5.445674e-03 7.073812e-03 2.132796e-03 1.876174e-05 8.130829e-03 9.847369e-03 1.030783e-02 1.512705e-03 9.367196e-03 6.528449e-04 6.375494e-03 7.148859e-03 2.641589e-03 3.284576e-03 6.296631e-03 7.130415e-03 7.849721e-03 8.128921e-03 5.066624e-03 3.874776e-03 9.191662e-03 4.457980e-03 3.411139e-03 7.496746e-03 4.857383e-03 6.973325e-03 4.334598e-03 2.088913e-03 5.151847e-03 5.153119e-03 7.408979e-03 1.038605e-02 9.148415e-03 6.381853e-03 7.348560e-03 6.031422e-03 8.010627e-03 1.108851e-03 1.012275e-02 8.048786e-03 9.479448e-04 5.256149e-03 3.879228e-03 9.053334e-04 8.880027e-03 1.318728e-03 6.211408e-03 4.089105e-03 4.368941e-03 
+1.979046e-03 8.364079e-03 2.434097e-03 1.018381e-03 4.022485e-03 1.062217e-02 1.292652e-04 1.447436e-02 6.119348e-03 1.327902e-02 9.692029e-03 5.128156e-03 1.005454e-02 1.547891e-02 1.330335e-03 1.556763e-02 1.258165e-02 3.912777e-03 1.267896e-02 1.946610e-03 1.348890e-02 1.411567e-02 1.233553e-02 6.563906e-03 8.524349e-03 8.410824e-03 2.790888e-03 9.316158e-03 4.003405e-03 3.255480e-03 1.512546e-03 1.051770e-03 3.058005e-03 4.211375e-03 1.109057e-02 1.027778e-02 3.900375e-03 6.905433e-03 2.055364e-03 3.903237e-03 9.869470e-03 7.436804e-03 1.723377e-03 1.266274e-02 8.037815e-03 9.723510e-03 3.273606e-03 6.205207e-03 2.644928e-03 4.648301e-03 1.731486e-04 1.311684e-02 7.525525e-03 3.502562e-03 3.763001e-03 5.974342e-03 9.519357e-03 1.096846e-02 2.376858e-03 1.149506e-02 1.286499e-02 3.585559e-03 7.117218e-03 1.427880e-02 5.244542e-03 1.489603e-02 5.782591e-03 2.163165e-03 6.069741e-03 1.019287e-02 1.223631e-02 1.153608e-02 1.097896e-02 7.637141e-03 1.078816e-02 5.410536e-03 1.314928e-02 1.323514e-02 4.406942e-03 1.000303e-02 1.409515e-03 1.617485e-03 2.845266e-03 6.291066e-03 1.076574e-03 3.768248e-05 1.085780e-02 5.531692e-03 7.439666e-03 5.817888e-03 1.021195e-02 1.435035e-02 1.167060e-02 7.034221e-03 6.250044e-03 1.387908e-02 1.165247e-02 1.357475e-02 8.907851e-03 7.684363e-04 
+4.569597e-03 1.901041e-02 1.782747e-02 1.565619e-02 6.412699e-03 7.413749e-03 1.647154e-02 2.105131e-04 1.137470e-02 8.740427e-03 1.750439e-02 2.132478e-03 6.785390e-03 1.606577e-02 3.109997e-04 5.037686e-03 1.329222e-04 1.222693e-02 3.860466e-04 4.902856e-03 7.842407e-03 1.340033e-03 4.429679e-03 4.368623e-03 2.059403e-02 8.664108e-03 1.664580e-02 5.129269e-03 1.513977e-02 3.542471e-04 1.030878e-02 1.291062e-04 4.996983e-03 1.189367e-02 2.201165e-03 5.956057e-03 1.899388e-02 5.453624e-03 1.347983e-02 5.241203e-03 1.535346e-02 1.013961e-02 1.882725e-02 4.667539e-03 1.967947e-02 7.091938e-03 1.850925e-02 5.802148e-03 1.535346e-02 1.446562e-02 1.518429e-02 4.037908e-03 9.237772e-03 1.475309e-02 2.022770e-02 1.556843e-02 8.665380e-03 4.882504e-03 1.177156e-02 1.809077e-02 1.379910e-02 5.172516e-03 6.627664e-03 7.526956e-03 5.519767e-03 6.710343e-03 1.260344e-02 1.279042e-02 1.105989e-03 4.630652e-03 1.242790e-02 1.669668e-02 1.480397e-02 5.425641e-03 4.067164e-03 1.026553e-02 1.514867e-02 1.480397e-02 1.808187e-02 3.008874e-03 3.057210e-03 8.240538e-03 2.002736e-03 1.143830e-02 7.862759e-03 1.622859e-02 1.283875e-02 1.522499e-02 8.992279e-03 1.200815e-02 1.647281e-02 1.207175e-02 1.016123e-02 4.802369e-03 5.788156e-03 1.486502e-02 1.131619e-02 1.515376e-02 1.127676e-02 1.043852e-02 
+2.209274e-03 2.525918e-02 2.324627e-02 2.180734e-02 1.285497e-03 3.813562e-03 2.111729e-02 1.256639e-02 2.039862e-02 1.392264e-02 1.841433e-02 1.953208e-02 2.248785e-02 2.187571e-02 2.359607e-02 2.299029e-02 8.523077e-03 2.160542e-02 5.282702e-03 3.501926e-03 2.324468e-02 1.756687e-02 1.783160e-03 1.782286e-02 1.008285e-02 5.330401e-03 1.254731e-02 2.582363e-02 1.333197e-03 2.369465e-02 5.277932e-03 1.348858e-02 4.457503e-03 1.275719e-02 9.586772e-03 2.319857e-02 3.360418e-03 2.033025e-02 2.567576e-02 2.297439e-02 5.290652e-03 1.490843e-02 3.994820e-03 1.862898e-02 1.446641e-02 6.095180e-03 2.582681e-02 4.276246e-03 2.176441e-02 8.332279e-03 1.850019e-02 2.267070e-02 1.620585e-02 8.443578e-03 9.976317e-03 1.577020e-02 1.570103e-03 9.671041e-03 1.861149e-02 9.872968e-03 1.187316e-02 1.446959e-02 2.443081e-02 1.920773e-02 7.529341e-03 1.076177e-02 2.159747e-02 2.708527e-03 2.333531e-02 2.298711e-02 1.172370e-02 1.848588e-02 2.510019e-02 6.250998e-03 1.082377e-02 2.201086e-02 6.901299e-03 1.013531e-02 1.465880e-02 1.792621e-02 1.351720e-02 1.116960e-03 2.095829e-02 2.050515e-02 2.097737e-02 3.036063e-03 2.187571e-02 1.469696e-02 1.709942e-02 2.471541e-02 1.437261e-02 1.929677e-02 1.507538e-02 2.260154e-03 2.585384e-02 1.305769e-02 2.010766e-02 4.964706e-03 9.839578e-03 2.566463e-02 

+ 9 - 0
Lab3/lab_3_time.csv

@@ -0,0 +1,9 @@
+1.000000, 0.000015
+10.000000, 0.000012
+100.000000, 0.000012
+1000.000000, 0.000012
+10000.000000, 0.000013
+100000.000000, 0.000012
+1000000.000000, 0.000012
+10000000.000000, 0.000011
+100000000.000000, 0.000011

+ 16 - 0
Lab3/matrix.m

@@ -0,0 +1,16 @@
+file = fopen('lab_3.txt', 'w')
+for x = 0 : 1 : 8
+   A = rand(10)
+   cond(A)
+   [u d v] = svd(A)
+   d = eye(10)
+   d(1,1) = 10.^x
+   M1 = u*d*v'
+   cond(M1)
+   if issymmetric(M1) ~= 0
+       prinf("error")
+   end
+   formatSpec='%.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f\n'
+   fprintf(file, formatSpec, M1)
+end
+fclose(file)