Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 06.10.2020
Сообщений: 27

Обращение матриц

24.02.2021, 10:40. Показов 1017. Ответов 1

Студворк — интернет-сервис помощи студентам
Задание: вычислить элементы ai,j(i,j = 1,2,...,n) матрицы А по формуле tg(i2+j2), n =7. Найти обратную матрицу A-1. Найти произведение матриц H = A.A-1.
Проблема в том, что не считается и не выводится произведение матриц. За границы массивов не выхожу. В чем ошибка?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <iostream>
#include <iomanip>
#include <math.h>
 
using namespace std;
//функция вычисления элементов матрицы А
double f(int i, int j) {
    return tan(i * i + j * j);
}
//функция перестановки 2 произвольных строк в матрице
void Perest(double** A, int i1, int i2, int n) {
    double* temp = new double[n];
    for (int i = 0; i < n; i++) {
        temp[i] = A[i1][i];
        A[i1][i] = A[i2][i];
        A[i2][i] = temp[i];
    }
    delete[] temp;
    temp = nullptr;
}
 
//прямой ход метода Гаусса для решения системы линейных уравнений(приведение матрицы к диагональному виду)
void GaussPr(double** A, int n) {
    for (int i = 0; i < n; i++) {
        if (A[i][i] == 0) Perest(A, i, i + 1, 2 * n);
        double first = A[i][i];
        for (int z = 0; z < 2 * n; z++) {
            A[i][z] /= first;
        }
        for (int k = i + 1; k < n; k++) {
            double koef = A[k][i];
            for (int z = 0; z < 2 * n; z++) {
                A[k][z] -= A[i][z] * koef;
            }
        }
    }
}
//обратный ход метода Гаусса (вычисление x[i])
void GaussObr(double** A, double* x, int n, int k) {
    //начало обратного хода
    x[n-1] = A[n-1][n + k];
    for (int i = n - 2; i >= 0; i--) {
        double S = A[i][n + k];
        for (int j = n-1; j >= i + 1; j--) {
            S -= A[i][j] * x[j];
        }
        x[i] = S;
    }
 
}
 
double Determ(double** A, int n) {
    double d(1);
    for (int i = 0; i < n; i++) {
        d *= A[i][i];
    }
    return d;
}
//функция произведения матриц
void PrMatr(double** A, double** B, double** C, int n) {
    double c = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int z = 0; z < n; z++) {
                c += A[i][z] * B[z][j];
            }
            C[i][j] = c;
            c = 0;
        }
    }
}
int main() {
    setlocale(LC_ALL, "ru");
    int n = 7;
    //создаю матрицу n x 2n
    double** R = new double*[n];
    for (int i = 0; i < n; i++) {
        R[i] = new double[2 * n];
    }
    //в левой половине матрица из элементов составленных по формуле f. В правой половине единичная матрица
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            R[i][j] = f(i, j);
        }
        for (int j = n; j < 2 * n; j++) {
            if (i == j - n)R[i][j] = 1;
            else R[i][j] = 0;
        }
    }
//вывод матрицы на экран
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 2*n; j++) {
            cout << setprecision(3) << setw(8) << R[i][j] << '\t';
        }
        cout << endl;
    }
    cout << endl;
    //приведение к диагональному виду матрицы R
    GaussPr(R, n);
    //вывод матрицы на экран
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 2 * n; j++) {
            cout << setprecision(3) << setw(8) << R[i][j] << '\t';
        }
        cout << endl;
    }
//создание обратной матрицы и матрицы произведения
    double** R_obr = new double* [n];
    double** A = new double* [n];
    for (int i = 0; i < n; i++) {
        R_obr[i] = new double[n];
        A[i] = new double[n];
    }
    //вычисление элементов обратной матрицы (алгоритм в 3 фото)
    for (int k = 0; k < n; k++) {
        double* x = new double[n];
        GaussObr(R, x, n, k);
        for (int i = 0; i < n; i++) {
            R_obr[i][k] = x[i];
        }
    }
    //вывод матрицы на экран
    cout << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << setprecision(3) << setw(8) << R_obr[i][j] << '\t';
        }
        cout << endl;
    }
    //вычисление произведения матриц
    PrMatr(R_obr, R, A, n);
//вывод итоговой матрицы на экран, что не происходит
    cout << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << setprecision(3) << setw(8) << A[i][j] << '\t';
        }
        cout << endl;
    }
//очистка памяти
    for (int i = 0; i < 2 * n; i++) {
        delete[] R[i];
        R[i] = nullptr;
    }
    delete[] R;
    R = nullptr;
    for (int i = 0; i < n; i++) {
        delete[] R_obr[i];
        R_obr[i] = nullptr;
        delete[] A[i];
        A[i] = nullptr;
    }
    delete[] R_obr;
    R_obr = nullptr;
    delete[] A;
    A = nullptr;
    return 0;
}
Миниатюры
Обращение матриц   Обращение матриц   Обращение матриц  

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.02.2021, 10:40
Ответы с готовыми решениями:

Умножение треугольных матриц«Методы обработки разреженных матриц»
Нужно перемножить треугольные матрицы в обычном виде и в свёрнутом. С обычным проблем нет. Доступ к элементам свёрнутой матрицы...

Возведение матриц в степени, перемножение и сложение матриц
Даны 3-ех элементные вещественные векторы x и y и квадратные матрицы A и B. Вычислить: (A 2 * x, y) + (B 2 * y, x) + (A * B * x, y) ...

Транспонирование матриц. Произведение транспонированных матриц
Найти матрицу С: C=ATBTB; A=\begin{bmatrix}1\\ 1\\ 1\end{bmatrix} B=\begin{bmatrix}1 &amp; 2 &amp; 0 \\ 0 &amp; 1 &amp; 2\end{bmatrix} ...

1
0 / 0 / 0
Регистрация: 06.10.2020
Сообщений: 27
24.02.2021, 11:16  [ТС]
Ошибся в создании исходной матрицы. Вот так должно быть. Проблема все еще не ушла

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <iostream>
#include <iomanip>
#include <math.h>
 
using namespace std;
//функция вычисления элементов матрицы А
double f(int i, int j) {
    return tan(i * i + j * j);
}
//функция перестановки 2 произвольных строк в матрице
void Perest(double** A, int i1, int i2, int n) {
    double* temp = new double[n];
    for (int i = 0; i < n; i++) {
        temp[i] = A[i1][i];
        A[i1][i] = A[i2][i];
        A[i2][i] = temp[i];
    }
    delete[] temp;
    temp = nullptr;
}
 
//прямой ход метода Гаусса для решения системы линейных уравнений(приведение матрицы к диагональному виду)
void GaussPr(double** A, int n) {
    for (int i = 0; i < n; i++) {
        if (A[i][i] == 0) Perest(A, i, i + 1, 2 * n);
        double first = A[i][i];
        for (int z = 0; z < 2 * n; z++) {
            A[i][z] /= first;
        }
        for (int k = i + 1; k < n; k++) {
            double koef = A[k][i];
            for (int z = 0; z < 2 * n; z++) {
                A[k][z] -= A[i][z] * koef;
            }
        }
    }
}
//обратный ход метода Гаусса (вычисление x[i])
void GaussObr(double** A, double* x, int n, int k) {
    //начало обратного хода
    x[n-1] = A[n-1][n + k];
    for (int i = n - 2; i >= 0; i--) {
        double S = A[i][n + k];
        for (int j = n-1; j >= i + 1; j--) {
            S -= A[i][j] * x[j];
        }
        x[i] = S;
    }
 
}
 
double Determ(double** A, int n) {
    double d(1);
    for (int i = 0; i < n; i++) {
        d *= A[i][i];
    }
    return d;
}
//функция произведения матриц
void PrMatr(double** A, double** B, double** C, int n) {
    double c = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int z = 0; z < n; z++) {
                c += A[i][z] * B[z][j];
            }
            C[i][j] = c;
            c = 0;
        }
    }
}
int main() {
    setlocale(LC_ALL, "ru");
    int n = 7;
    //создаю матрицу n x 2n
    double** R = new double*[n];
    for (int i = 0; i < n; i++) {
        R[i] = new double[2 * n];
    }
    //в левой половине матрица из элементов составленных по формуле f. В правой половине единичная матрица
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            R[i][j] = f(i+1, j+1);
        }
        for (int j = n; j < 2 * n; j++) {
            if (i == j - n)R[i][j] = 1;
            else R[i][j] = 0;
        }
    }
//вывод матрицы на экран
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 2*n; j++) {
            cout << setprecision(3) << setw(8) << R[i][j] << '\t';
        }
        cout << endl;
    }
    cout << endl;
    //приведение к диагональному виду матрицы R
    GaussPr(R, n);
    //вывод матрицы на экран
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 2 * n; j++) {
            cout << setprecision(3) << setw(8) << R[i][j] << '\t';
        }
        cout << endl;
    }
//создание обратной матрицы и матрицы произведения
    double** R_obr = new double* [n];
    double** A = new double* [n];
    for (int i = 0; i < n; i++) {
        R_obr[i] = new double[n];
        A[i] = new double[n];
    }
    //вычисление элементов обратной матрицы (алгоритм в 3 фото)
    for (int k = 0; k < n; k++) {
        double* x = new double[n];
        GaussObr(R, x, n, k);
        for (int i = 0; i < n; i++) {
            R_obr[i][k] = x[i];
        }
    }
    //вывод матрицы на экран
    cout << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << setprecision(3) << setw(8) << R_obr[i][j] << '\t';
        }
        cout << endl;
    }
    //вычисление произведения матриц
    PrMatr(R_obr, R, A, n);
//вывод итоговой матрицы на экран, что не происходит
    cout << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << setprecision(3) << setw(8) << A[i][j] << '\t';
        }
        cout << endl;
    }
//очистка памяти
    for (int i = 0; i < 2 * n; i++) {
        delete[] R[i];
        R[i] = nullptr;
    }
    delete[] R;
    R = nullptr;
    for (int i = 0; i < n; i++) {
        delete[] R_obr[i];
        R_obr[i] = nullptr;
        delete[] A[i];
        A[i] = nullptr;
    }
    delete[] R_obr;
    R_obr = nullptr;
    delete[] A;
    A = nullptr;
    return 0;
}
Добавлено через 13 минут
Так, тема закрыта. Оказывается, надо умножать исходную матрицу на обратную матрицу, а не преобразованную после метода Гаусса
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.02.2021, 11:16
Помогаю со студенческими работами здесь

Вычисление степени матрицы, вычисления произведения двух матриц, вычисление суммы двух матриц
Здравствуйте, помогите решить, пожалуйста: Заданы две квадратные матрицы А и В. Вычислить матрицу...

Вычисление детерминанта матрицы,перемножение матриц,разложение матриц,обращение матриц
Добрый день ! Хочу предоставить ссылку на очень полезную информация по работе с матрицами на C#. ...

Обращение матриц
в матлабе существует функция Inv для обращения матриц помогите, пожалуйста, ее реализовать для матрицы 3х3. как именно она работает?

Обращение матриц методами окаймления
Написать программу на языке C - Обращение матриц методами окаймления. Матрица должна вводиться из текстового файла. Результаты,...

Обращение матриц методом Жордана-Гаусса
Доброго времени суток!Задача следующая: обращение матрицы методом Жордана-Гаусса. Прошу проверить на корректность написание моего ущербного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru