Форум программистов, компьютерный форум 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<<"; "; } out<<endl; for(int i=0;i<outstream.n;i++){ out<<"k="<<outstream.k<<"; "; } 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 ; const double Pi=3.14;
Точки пересечения прямой и функции с множеством точек C++
Как найти количество пересечений прямой y с множеством точек (x,y)?
C++ Процедуры и Функции. Найти сумму элементов массива Т, имеющих четные порядковые номера http://www.cyberforum.ru/cpp-beginners/thread756791.html
Программу нужно сделать с процедурами и функциями Вот задание само: Дан произвольный массив Т размерности n. Найти сумму элементов массива Т, имеющих четные порядковые номера, а также сумму элементов массива Т, имеющих нечетные порядковые номера. Исходные данные взять самостоятельно. В функциях и процедурах плаваю ваще( #include <iostream> #include <cstdlib> #include <ctime> using...
C++ В заданном массиве натуральных чисел заменить все числа на такие числа, которые получаться из исходного записью его цифр в обратном порядке Ребят выручайте не могу зачет сдать из-за этой лабы =( не могу сделать. надо сделать через тип данных вектор. " В заданном массиве натуральных чисел { A1, A2, .... An } заменить все числа на такие числа, которые получаться из исходного записью его цифр в обратном порядке. Например для числа 156 на 651. " Как препод объяснил надо каждое число в массиве перевернуть на обратное ему Надеюсь на... подробнее

Показать сообщение отдельно
lemegeton
2917 / 1346 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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;
}
 
Текущее время: 05:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru