Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
01.11.2025
Размер:
3.19 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <locale.h>

// Функция для выделения памяти под матрицу n x n
double** create_matrix(int n) {
    double** A = (double**)malloc(n * sizeof(double*));
    for (int i = 0; i < n; i++) {
        A[i] = (double*)malloc(n * sizeof(double));
    }
    return A;
}

// Функция для освобождения памяти
void free_matrix(double** A, int n) {
    for (int i = 0; i < n; i++) {
        free(A[i]);
    }
    free(A);
}

// Функция для генерации положительно определённой симметрической матрицы
void generate_positive_definite_matrix(double** A, int n) {
    // Создаём случайную матрицу B
    double** B = create_matrix(n);
    srand(time(NULL));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            B[i][j] = (double)rand() / RAND_MAX * 10.0; // [0, 10]
        }
    }
    // A = B * B^T
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            A[i][j] = 0;
            for (int k = 0; k < n; k++) {
                A[i][j] += B[i][k] * B[j][k];
            }
        }
    }
    free_matrix(B, n);
}

// Вычисление m-нормы
double m_norm(double** A, int n) {
    double max_sum = 0;
    for (int i = 0; i < n; i++) {
        double row_sum = 0;
        for (int j = 0; j < n; j++) {
            row_sum += fabs(A[i][j]);
        }
        if (row_sum > max_sum) {
            max_sum = row_sum;
        }
    }
    return max_sum;
}

// Вычисление l-нормы
double l_norm(double** A, int n) {
    double max_sum = 0;
    for (int j = 0; j < n; j++) {
        double col_sum = 0;
        for (int i = 0; i < n; i++) {
            col_sum += fabs(A[i][j]);
        }
        if (col_sum > max_sum) {
            max_sum = col_sum;
        }
    }
    return max_sum;
}

// Вычисление k-нормы (Фробениуса)
double k_norm(double** A, int n) {
    double sum_sq = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            sum_sq += A[i][j] * A[i][j];
        }
    }
    return sqrt(sum_sq);
}

// Вывод матрицы
void print_matrix(double** A, int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%8.3f ", A[i][j]);
        }
        printf("\n");
    }
}

int main() {
    setlocale(LC_ALL, "ru_RU.UTF-8");
    
    int n;
    printf("Введите размерность матрицы n: ");
    scanf("%d", &n);

    double** A = create_matrix(n);
    generate_positive_definite_matrix(A, n);

    printf("\nСгенерированная положительно определённая симметрическая матрица:\n");
    print_matrix(A, n);

    printf("\nm-норма: %.6f\n", m_norm(A, n));
    printf("l-норма: %.6f\n", l_norm(A, n));
    printf("k-норма: %.6f\n", k_norm(A, n));

    free_matrix(A, n);
    return 0;
}
Соседние файлы в папке Лаба9