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

Метод Гаусса для решения СЛАУ - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Error C4703: используется потенциально неинициализированная локальная переменная-указатель http://www.cyberforum.ru/cpp-beginners/thread1729522.html
#include <iostream> #include <cstdlib> using namespace std; class BinarySearchTree { private: struct tree_node { tree_node* left;
C# Кнопка убегающая от указателя мыши Создать следующую программу: при наведении указателя мыши на кнопку ее координаты изменяются произвольным образом в пределах формы (кнопка убегает от указателя мыши) в форме...на си шарп http://www.cyberforum.ru/cpp-beginners/thread1729516.html
C++ Индексация элементов массива
Всем привет! Есть следующий код: const double c = { // particle velocities {0, 0}, // zero {1, 0}, {0, 1}, // east, north {-1, 0}, {0, -1}, // west, south {1, 1}, {-1, 1}, // north-east, north-west {-1, -1}, {1, -1} // south-west, south-east };
C++ Недопустимый неполный тип, не могу найти ошибку
#include<iostream> #include<locale> #include<string> #include<iomanip> #include<fstream> void Poisk_1(), Poisk_2(), Poisk_3(), Poisk_4(); using namespace std;
Visual Studio Автоматический выбор функции в IntelliSense http://www.cyberforum.ru/cpp-beginners/thread1729448.html
Как настроить Визуал Студио чтобы функции автоматически выделялись? Чтобы каждый раз не нажимать стрелку вниз для выбора \
C++ Что сделать, чтобы математический парсер заработал? #include "stdafx.h" #ifndef PARSER_H_INCLUDED #define PARSER_H_INCLUDED #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <iostream> подробнее

Показать сообщение отдельно
RefSol
220 / 159 / 39
Регистрация: 31.10.2010
Сообщений: 496
08.05.2016, 11:13     Метод Гаусса для решения СЛАУ
AutumnTrees,
Данный класс реализует хранилище данных для систем линейных уравнений (матрица коэффицентов matA, вектор правых частей vecB, и вектор искомых значений vecX. Векторы и матрицы инициализируются начальным значением 0. В результате того, что класс реализован как шаблон он может работать со следующими типами данных: float, double, long double, complex (при перегрузке определённых функций и операторов).

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
// файл data.h, шаблонный класс data, C++
#include <vector>
using namespace std;       // пространство имён std
typedef unsigned int uint; // беззнаковый целый
template<class Type>
class data {
public: // открытые свойства и методы
  data(uint ms) {   // конструктор
    try {
      msize = ms;
      vecB.assign(msize, (Type)0);
      vecX.assign(msize, (Type)0);
      matA.resize(msize);
      for (uint i=0; i<msize; i++) matA.at(i).assign(msize, (Type)0);
    } catch (...) {
      msize = 0;
      throw;
    }
  }
  ~data() {} // деструктор
  // методы для манипулирования данными
  uint size() {return (msize);}
  void savA(uint j, uint i, Type val) {matA.at(j).at(i) = val;}
  void savB(uint j, Type val) {vecB.at(j) = val;}
  Type readA(uint j, uint i) {return (matA.at(j).at(i));}
  Type readB(uint j) {return (vecB.at(j));}
  Type readX(uint j) {return (vecB.at(j));}
protected: // защищённые свойства и методы
  typedef vector<Type> vType; // тип вектор типа Type
  typedef vector<Type>::iterator pvType; // итератор для вектора типа Type
  vector<vType> matA; // матрица коэффициентов A
  vType vecB; // вектор правых частей B
  vType vecX; // вектор искомый X
  uint msize; // размер матриц и векторов
};
Данный класс реализует метод последовательного исключения Гаусса с выделением ведущего элемента (bigelem() и gauss()), или без него (gauss()). Реализация несколько «облегчена» для сокращения размера листинга. При этом листинг содержит отладочный код который будет полезен для изучения алгоритма. В данной реализации массивы matA и vecB изменяются в ходе вычислений, что необходимо учитывать при использовании класса. У такого подхода есть положительная сторона – экономия памяти и отрицательная – изменение исходных данных. Отметим, что реализации алгоритма отсутствует проверка возможности возникновения исключительных ситуаций.


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
// листинг C++ кода (файл algorithm.h), шаблонный класс algorithm, C++
#define DEBUG true
#include <iostream>
#include <math.h>
#include "data.h"
// класс некоторых действий линейной алгебры
template<class Type> class algorithm : public data<Type> {
public: // открытые свойства и методы
  algorithm(uint ms) : data<Type>(ms) {} // конструктор
  bigelem() { // формирование системы с ведущим элементом
    uint k, i, j, kmax;
    Type maxval;
    for(k = 0; k < size(); k++) { 
      maxval = matA.at(k).at(k); // проход по диагонали
      kmax = k;
      for(j = k + 1; j < size(); j++) { // больший элемент в столбце
        if(abs(matA.at(j).at(k)) > abs(maxval)) {
          maxval = matA.at(j).at(k);
          kmax = j;
        }
      }
      if(kmax != k) { // если требуется перестановка
        for(i = 0; i < size(); i++) { // перестановка строк матрицы A
          maxval = matA.at(k).at(i);
          matA.at(k).at(i) = matA.at(kmax).at(i);
          matA.at(kmax).at(i) = maxval;
        }
        maxval = vecB.at(k); // перестановка элементов вектора B
        vecB.at(k) = vecB.at(kmax);
        vecB.at(kmax) = maxval;
      }
    }
  }
 
gauss() {  // метод исключения Гаусса
    int k, i, j;
    Type temp;
    for(k = 1; k < size(); k++) { // прямой ход
      for(i = k; i < size(); i++) {
        temp = matA.at(i).at(k - 1) / matA.at(k - 1).at(k - 1);
        for(j = 0; j < size(); j++) {
          matA.at(i).at(j) =
               matA.at(i).at(j) - temp * matA.at(k - 1).at(j);
        }
        vecB.at(i) = vecB.at(i) - temp * vecB.at(k - 1);
      }
#if (DEBUG == true)
      cout << "Forward stroke, cycle: " << k << endl;
      prnls();
#endif
    }
#if (DEBUG == true)
    cout<<"Reverse"<<endl;
#endif
    for(k = size() - 1; k >= 0; k--) { // обратный ход
      temp = vecB.at(k);
      for(j = size() - 1; j > k; j--) {
        temp -= matA.at(k).at(j) * vecX.at(j);
      }
      vecX.at(k) = temp / matA.at(k).at(k);
#if (DEBUG == true)
      cout<<"X["<<k<<"] = "<<vecX.at(k)<<endl;
#endif
    }
  }
  void prnls() { // вывод системы в поток экрана
    int j, i;
    for(j = 0; j < size(); j++) {
      for(i = 0; i < size(); i++) {
        if(matA.at(j).at(i) < 0)
          cout<<matA.at(j).at(i)<<"*X["<<i <<"]";
        else
          cout<<"+"<<matA.at(j).at(i)<<"*X[" <<i<<"]";
      }
      cout<<"="<<vecB.at(j)<<endl;
    }
    return;
  }
};
Пример использования
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
// листинг C++ кода проверки классов data и algorithm
#include <iostream>
#include <stdlib.h>
#include "algorithm.h"
using namespace std;
int main(int argc, char* argv[]) {
  cout << "Size of the system of equations:  ";
  int sz;
  float val;
  cin>>sz;  // порядок системы
  // объект класса шаблонного algorithm
  algorithm<float> *la = new algorithm<float>(sz);
  // ввод системы линейных уравнений
  cout<<"Enter lines of system of linear equations:  "<<endl;
  for (int j = 0; j < sz; j++) {
    cout<<"A["<<j<<",1]+...+A["<<j<<", "
        <<(sz-1)<<"]=B["<<j<<"]"<<endl;
    for (int i = 0; i < sz; i++) {
      cin>>val;
      la->savA(j, i, val);
    }
    cin>>val;
    la->savB(j, val);
  }
  cout<<"Linear system:"<<endl;
  la->prnls();
  la->bigelem();
  cout<<"Linear system:"<<endl;
  la->prnls();
  la->gauss();
  delete la;
  system("pause");
  return 0;
}
 
Текущее время: 18:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru