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

доделать программу для решения СЛАУ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Написать функцию для удаления строки из двумерного массива http://www.cyberforum.ru/cpp-beginners/thread756810.html
Написать функцию для удаления строки из двумерного массива. Оставшиеся строки должны быть расположены плотно, недостающие элементы заменяются 0. С помощью разработанных функций исключить из массива...
C++ Перегрузка потокового ввода/вывода Вот сама перегрузка ostream& operator<< (ostream& out, Poli& outstream) { out<<"Степень полинома="<<outstream.n<<endl; for(int i=0;i<outstream.n;i++){ out<<"x="<<outstream.x<<"; "; }... http://www.cyberforum.ru/cpp-beginners/thread756801.html
C++ While do. Вычислить
Косяк в условиях,помогите исправить,задание я прикрепил если нужно #include<iostream> #include <math.h> using namespace std; int main() { setlocale (LC_ALL,".ACP"); double k,E,m,L,d0,d ;...
Точки пересечения прямой и функции с множеством точек C++
Как найти количество пересечений прямой y с множеством точек (x,y)?
C++ Процедуры и Функции. Найти сумму элементов массива Т, имеющих четные порядковые номера http://www.cyberforum.ru/cpp-beginners/thread756791.html
Программу нужно сделать с процедурами и функциями Вот задание само: Дан произвольный массив Т размерности n. Найти сумму элементов массива Т, имеющих четные порядковые номера, а также сумму...
C++ В заданном массиве натуральных чисел заменить все числа на такие числа, которые получаться из исходного записью его цифр в обратном порядке Ребят выручайте не могу зачет сдать из-за этой лабы =( не могу сделать. надо сделать через тип данных вектор. " В заданном массиве натуральных чисел { A1, A2, .... An } заменить все числа на такие... подробнее

Показать сообщение отдельно
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
10.01.2013, 01:48
Вы уверены, что у вас реализован метод Гаусса? Какой-то "основной элемент"...

Сложно продираться сквозь ваш код, разбейте, пожалуйста, на функции.
Попробуйте добавить перестановку строк при прямом проходе алгоритма.

На скору руку если:
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
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>
#include <iterator>
#include <iomanip>
#include <vector>
#include <stdexcept>
 
typedef std::vector<double> Row;
typedef std::vector<Row> Matrix;
 
Row operator-(const Row &a, const Row &b) {
  Row result;
  for (int i = 0; i < a.size(); ++i) {
    result.push_back(a[i] - b[i]);
  }
  return result;
}
 
Row operator*(double value, const Row &row) {
  Row result;
  for (int i = 0; i < row.size(); ++i) {
    result.push_back(row[i] * value);
  }
  return result;
}
 
Row operator/(const Row &row, double value) {
  Row result;
  for (int i = 0; i < row.size(); ++i) {
    result.push_back(row[i] / value);
  }
  return result;
}
 
std::ostream &operator<<(std::ostream &stream, const Row &row) {
  stream << "|";
  for (int i = 0; i < row.size(); ++i)
    stream << std::setprecision(4) << std::setw(8) << std::fixed << row[i];
  return stream << "|";
}
 
std::ostream &operator<<(std::ostream &stream, const Matrix &matrix) {
  for (int i = 0; i < matrix.size(); ++i) {
    std::cout << matrix[i] << std::endl;
  }
  return stream;
}
 
// метод, выбирающий строку для перстановки
int findLineToSwap(const Matrix &matrix, int start) {
  double maximum = fabs(matrix[start][start]);
  int result = start;
  for (int k = start; k <  matrix.size(); ++k) {
    if (fabs(matrix[start][k]) > maximum) {
      maximum = fabs(matrix[start][k]);
      result = k;
    }
  }
  return result;
}
 
// метод, производящий трансформацию Гаусса
// только для простейших случаев, совместность системы не проверяется
Matrix gaussianTransform(const Matrix &matrix) {
  Matrix result = matrix;
  for (int j = 0; j < result.size() - 1; ++j) {
    // коррекция ошибки путем перестановки строк
    int swapLine = findLineToSwap(result, j);
    if (swapLine != j) {
      std::swap(result[j], result[swapLine]);
    }
    // вычитание строк
    for (int i = j + 1; i < result.size(); ++i) {
      result[i] = result[i] - (result[i][j] / result[j][j]) * result[j];
    }
//    std::cout << "INTERMEDIATE TRANSFORM RESULT" << std::endl << result << std::endl;
  }
  return result;
}
 
// метод, вычисляющий корни СЛАУ по матрице Гаусса
Row getAnswersFromGaussianTransformedMatrix(const Matrix &matrix) {
  Matrix result = matrix;
  for (int i = result.size() - 1; i > -1; --i) {
    result[i][result[i].size() - 1] /= result[i][i];
    result[i][i] = 1;
    for (int j = i - 1; j > -1; --j) {
      result[j] = result[j] - (result[j][i] / result[i][i]) * result[i];
    }
  }
 
  Row results;
  for (int i = 0; i < result.size(); ++i) {
    results.push_back(result[i][result[i].size() - 1]);
  }
  return results;
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
 
  Matrix matrix = Matrix(3, Row(4, 0.0));  // дополненная матрица 3 на 4
 
  matrix[0][0] = 1; matrix[0][1] = -2; matrix[0][2] = 1; matrix[0][3] = 5.7;
  matrix[1][0] = 3.1; matrix[1][1] = 0; matrix[1][2] = -1; matrix[1][3] = 1.8;
  matrix[2][0] = 0; matrix[2][1] = 1; matrix[2][2] = -3.4; matrix[2][3] = -3.3;
 
/*
  matrix[0][0] = 4; matrix[0][1] = 2; matrix[0][2] = -1; matrix[0][3] = 1;
  matrix[1][0] = 5; matrix[1][1] = 3; matrix[1][2] = -2; matrix[1][3] = 2;
  matrix[2][0] = 3; matrix[2][1] = 2; matrix[2][2] = -3; matrix[2][3] = 0;
*/
 
  std::cout << "ORIGINAL:" << std::endl << matrix << std::endl;
  
  // трансформация гаусса (прямой проход)
  Matrix transformedMatrix = gaussianTransform(matrix);
  std::cout << "TRANSFORMED:" << std::endl << transformedMatrix << std::endl;
 
  // вычисление результатов (обратный проход)
  Row results = getAnswersFromGaussianTransformedMatrix(transformedMatrix);
  std::cout << "RESULTS:" << std::endl << results << std::endl;
 
  // проверка
  for (int i = 0; i < matrix.size(); ++i) {
    for (int j = 0; j < matrix.size(); ++j) {
      matrix[i][j] *= results[j];
    }
  }
  std::cout << std::endl << "CHECK:" << std::endl << matrix << std::endl;
 
  std::cin.peek();
  return 0;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru