Добавил:
vvrstcnho
Рад, если кому-то помог
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы С (для ИВТ) / Готовые лабы С / Лаба9 / Laba 9
.c#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;
} 