Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
kaztennis
4 / 4 / 0
Регистрация: 28.09.2013
Сообщений: 93
1

Метод Гаусса

05.11.2013, 17:42. Просмотров 680. Ответов 0
Метки нет (Все метки)

Всем привет. Задача: Написать код по решению задачи методом Гаусса. Код готов но код направлен на то что он выводит уже готовую матрицу. то есть матрица состоит из готовой лестницы, и переменная b из уравнения (Ax=b) также готова и равно размеру матрицы. Необходимо сделать так что бы мы сами вводили числа в матрицу. а сам код и циклы с условиями верна
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <stdafx.h> 
#include <stdio.h> //Заголовочный файл стандартной библиотеки языка Си, содержащий определения макросов, константы и объявления функций и типов.
#include <stdlib.h> //Заголовочный файл стандартной библиотеки языка Си, который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы
#include <conio.h> //Cтандартная библиотека, предназначенная для создания текстового интерфейса пользователя.
#include <time.h> //Заголовочный файл стандартной библиотеки языка программирования СИ, содержащий типы и функции для работы с датой и временем.
#include <math.h> //Заголовочный файл стандартной библиотеки языка программирования С, разработанный для выполнения простых математических операций.
int* pSerialPivotPos; //Количество строк, выбранных для поворота итераций
int* pSerialPivotIter; //Итерации, в которой строки поворачиваются
 
 
// Функция для простой инициализации матрицы и элементы вектора
void DummyDataInitialization (double* pMatrix, double* pVector, int Size) {
int i, j; // Задаем переменные
for (i=0; i<Size; i++) {
pVector[i] = i+1;
for (j=0; j<Size; j++) {
if (j <= i)
pMatrix[i*Size+j] = 1;
else
pMatrix[i*Size+j] = 0;
}
}
}
 
 
// Функция для случайной инициализации матриц и элементов вектора
void RandomDataInitialization (double* pMatrix, double* pVector, int Size) {
int i, j; // Задаем переменные
srand(unsigned(clock()));
for (i=0; i<Size; i++) {
pVector[i] = rand()/double(1000);
for (j=0; j<Size; j++) {
if (j <= i)
pMatrix[i*Size+j] = rand()/double(1000);
else
pMatrix[i*Size+j] = 0;
}
}
}
 
 
// Функция для заполнения памяти и определение объектов элементов
void ProcessInitialization (double* &pMatrix, double* &pVector, double* &pResult, int &Size) {
// Установка размера матрицы и вектора
do {
printf("\nEnter size of the matrix and the vector: ");
scanf("%d", &Size);
printf("\nChosen size = %d \n", Size);
if (Size <= 0)
printf("\nSize of objects must be greater than 0!\n");
} while (Size <= 0);
 
// Заполнение памяти
pMatrix = new double [Size*Size];
pVector = new double [Size];
pResult = new double [Size];
 
// Инициализация матрицы и векторных элементов
DummyDataInitialization(pMatrix, pVector, Size);
// RandomDataInitialization(pMatrix, pVector, Size);
}
// Функция для форматирования результирующей матрицы
void PrintMatrix (double* pMatrix, int RowCount, int ColCount) {
int i, j; // Задаем переменные
for (i=0; i<RowCount; i++) {
for (j=0; j<ColCount; j++)
printf("%7.4f ", pMatrix[i*RowCount+j]);
printf("\n");
}
}
 
// Функция для форматирования результирующего вектора
void PrintVector (double* pVector, int Size) {
int i;
for (i=0; i<Size; i++)
printf("%7.4f ", pVector[i]);
}
 
 
 
// Поиск ведущей строки
int FindPivotRow(double* pMatrix, int Size, int Iter) {
int PivotRow = -1; // Индекс сводной строки
int MaxValue = 0; // Значение поворачивающегося элемента
int i; // Задаем переменные
// Выбор строки, где находится максимальный элемент
for (i=0; i<Size; i++) {
if ((pSerialPivotIter[i] == -1) &&
(fabs(pMatrix[i*Size+Iter]) > MaxValue)) {
PivotRow = i;
MaxValue = fabs(pMatrix[i*Size+Iter]);
}
}
return PivotRow;
}
// Column elimination
void SerialColumnElimination (double* pMatrix, double* pVector, int Pivot,int Iter, int Size) {
double PivotValue, PivotFactor;
PivotValue = pMatrix[Pivot*Size+Iter];
for (int i=0; i<Size; i++) {
if (pSerialPivotIter[i] == -1) {
PivotFactor = pMatrix[i*Size+Iter] / PivotValue;
for (int j=Iter; j<Size; j++) {
pMatrix[i*Size + j] -= PivotFactor * pMatrix[Pivot*Size+j];
}
pVector[i] -= PivotFactor * pVector[Pivot];
}
}
}
// Gaussian elimination 
void SerialGaussianElimination(double* pMatrix,double* pVector,int Size) {
int Iter; // Количество итерации Гаусса
int PivotRow; // Номер текущей ведущей строки
for (Iter=0; Iter<Size; Iter++) {
// Поиск ведущей строки
PivotRow = FindPivotRow(pMatrix, Size, Iter);
pSerialPivotPos[Iter] = PivotRow;
pSerialPivotIter[PivotRow] = Iter;
SerialColumnElimination(pMatrix, pVector, PivotRow, Iter, Size);
}
}
// Back substution 
void SerialBackSubstitution (double* pMatrix, double* pVector,
double* pResult, int Size) {
int RowIndex, Row;
for (int i=Size-1; i>=0; i--) {
RowIndex = pSerialPivotPos[i];
pResult[i] = pVector[RowIndex]/pMatrix[Size*RowIndex+i];
for (int j=0; j<i; j++) {
Row = pSerialPivotPos[j];
pVector[j] -= pMatrix[Row*Size+i]*pResult[i];
pMatrix[Row*Size+i] = 0;
}
}
}
// Функция для выполнения алгоритма Гаусса
void SerialResultCalculation(double* pMatrix, double* pVector,
double* pResult, int Size) {
// Заполнение памяти
pSerialPivotPos = new int [Size];
pSerialPivotIter = new int [Size];
for (int i=0; i<Size; i++) {
pSerialPivotIter[i] = -1;
}
// Gaussian elimination
SerialGaussianElimination (pMatrix, pVector, Size);
// Back substitution
SerialBackSubstitution (pMatrix, pVector, pResult, Size);
// Удаление памяти
delete [] pSerialPivotPos;
delete [] pSerialPivotIter;
}
// Функция для прекращения вычислительных  процессов
void ProcessTermination (double* pMatrix, double* pVector, double* pResult) {
delete [] pMatrix;
delete [] pVector;
delete [] pResult;
}
void main() {
double* pMatrix; // Матрица линейной системы
double* pVector; // Правые части линейной системы
double* pResult; // Результирующий вектор
int Size; // Размеры исходной матрицы и вектора
time_t start, finish;
double duration;
printf("Serial Gauss algorithm for solving linear systems\n");
// Распределение памяти и определение элементов объектов
ProcessInitialization(pMatrix, pVector, pResult, Size);
// Выходные матрица и вектор
printf ("Initial Matrix \n");
PrintMatrix(pMatrix, Size, Size);
printf("Initial Vector \n");
PrintVector(pVector, Size);
// Выполнение алгоритма Гаусса
start = clock();
SerialResultCalculation(pMatrix, pVector, pResult, Size);
finish = clock();
duration = (finish-start)/double(CLOCKS_PER_SEC);
// Показ результирующего вектора
printf ("\n Result Vector: \n");
PrintVector(pResult, Size);
// Расчет время потраченного на выполнение метода Гаусса
printf("\n Time of execution: %f\n", duration);
// Процесс прекращения вычислений 
ProcessTermination(pMatrix, pVector, pResult);
getch();
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2013, 17:42
Ответы с готовыми решениями:

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Метод Гаусса
Суть в том что бы СЛАУ методом Гаусс с последовательным исключениям неизвестных.Вот система:...

Метод Гаусса
Как реализовать метод Гаусса в моей программе? Вкратце о том, что сделано: void Gauss(int...

Метод Гаусса
Всем привет. Ребят, что скажите по поводу такой реализации метода Гаусса: #include &lt;stdio.h&gt;...

метод гаусса
Помогите,пожалуйста Преподаватель попросил расписать программу по блокам #include &quot;stdio.h&quot;...

0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2013, 17:42

Метод Гаусса
В школе задали написать программу , которая решает систему уравнений методом Гаусса. Матрица...

Метод Гаусса
Помогите, пожалуйста, написать программу. Вот условие: Написать программу решения системы...

метод Гаусса
дана система линейных уравнений, в графическом режиме надо написать программу. Не понимаю как,...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.