Форум программистов, компьютерный форум CyberForum.ru

Метод Гаусса - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Не получается создать массив класса http://www.cyberforum.ru/cpp-beginners/thread998739.html
#include <iostream> using namespace::std; class dvig { friend void sum_all(dvig &,dvig &); public: dvig(long double ,long double,long double ,long double ,long double ,long double ,long double ,long double,long double ); void printparametr(); long double x,y,z,fx,fy,fz,Wx,Wy,Wz;
C++ Динамическое программирование. Метод прямой прогонки Мне нужно реализовать граф с поиском минимального пути из начала графа в конец путем прямой прогонки.Сделал граф, как список ребер, проверку, что из одной вершины в другую идет одна дуга, а как делать дальше не знаю. Помогите пожалуйста, желательно конечно кодом на с++, но и литератерка сойдет. http://www.cyberforum.ru/cpp-beginners/thread998737.html
C++ Определить четные значения в матрице
В целочисленной матрице размерами N*M определить количество элементов, которые имеют четные значения (N и M не больше 10). Матрицу сформировать из случайных чисел в диапазоне от 0 до 100. #include "time.h" #include "clocale" #include "iostream" using namespace std; int main() { int n,i,j,tmp=0; cout<<"n="; cin>>n;
C++ Поменять местами элементы массива
В массиве A из N элементов поменять местами первый элемент с последним, второй - с предпоследним и т.д. #include <iostream> #include <stdlib.h> using namespace std; int main() { int n,i,j; cout<<"n="; cin>>n; int a;
C++ Небольшие задачи с массивами http://www.cyberforum.ru/cpp-beginners/thread998695.html
Доброго времени суток.Изучаю массивы,пытаюсь решить задачи.Написал,но не выходит.Нужен совет. 1)В массиве A из N элементов определить количество элементов, значения которых больше среднего арифметического всех элементов. Число N и значения элементов массива задаются вводом. #include <iostream> #include <stdlib.h> using namespace std; int main() { int n,i,sr,sum,tmp; cout<<"vvedite...
C++ Сортировка строки матрицы Отсортировать элементы третьей строки матрицы (многомерного вектора) 5x6 элементов по возрастанию значений. Учесть особенности языка С + +. Неведомо мне как описать процесс сортировки=( Прошу помочь.:swoon: подробнее

Показать сообщение отдельно
kaztennis
3 / 3 / 0
Регистрация: 28.09.2013
Сообщений: 93
05.11.2013, 17:42     Метод Гаусса
Всем привет. Задача: Написать код по решению задачи методом Гаусса. Код готов но код направлен на то что он выводит уже готовую матрицу. то есть матрица состоит из готовой лестницы, и переменная 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();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru