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

решение системы уравнений методом Гауса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.83
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,410
09.12.2010, 10:02     решение системы уравнений методом Гауса #1
Вот, ради интереса попробовал написать программу (С++). Сейчас она работает, но выполняет лишь первый шаг. Нужно чтобы программа выполняла действия до конца. Идеальным было бы если она еще при этом выводила матрицу на экран каждый раз, но это не обязательно.

Вот что навоял:

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
#include<iostream>
#include<conio.h>
#include<clocale>
#include<iomanip>
using namespace std;
 
int main(){
    setlocale(LC_ALL,"Russian");
    int N,x,y,qwerty=2,m,n;
    double mas[128][128],max;
    cout<<"Введите m: ";
    cin>>m;
    cout<<"Введите n: ";
    cin>>n;
    cout<<"Введите матрицу построчно\n";    
      
    for (x=1,y=1;y<=n;x++){ 
        cin>> mas[x][y];
        if(x==m){
                 y++;
                 x=0;
        }
    }
    cout<<endl; 
    
    for(x=1,y=1;y<=n;x++){ // ищем максимальный эллемент матрицы
                          if(x==m){
                                   y++;
                                   x=0;
                                   }
                          if(x!=0 && x<m && mas[x+1][y]>=mas[x][y])
                                  max=mas[x+1][y];
                          }
    if(max<=abs(99)&&max>=abs(9)) // чтобы было красиво(setw)
    qwerty=2;
    else if(max>=abs(99)) 
    qwerty=3;
    
    for (x=1,y=1;y<=n;x++){ // выводим матрицу на экран
        cout<<setw(qwerty)<<mas[x][y]<<" ";
        if(x==m){
                 x=0;
                 y++;
                 cout<<endl;
                 }
        }
cout<<endl<<endl;
 
int zz=2; // переводит y
int zzz=1; // переводит х <<<<<<<<<<<<Вот тут косяки начинаются
x=1,y=2;
//while(x<=m-1){   // этот цикл должен переводить х на позицию вправо если есть еще строки или кол-во столбцов не закончилось
            while(y>zz-1 && y<=n) // удаляем из строки первую * n
            {
                      if(mas[zzz][zz]!=0){
                      double umn=mas[zzz][y]/mas[zzz][1];
                      for(x=zzz;x<=m;x++) // удаляем строки
                      mas[x][zz]=mas[x][zz]-mas[x][1]*umn;
                      }                 
                 zz++;
                 y++;
            }
                 if(y==n){ // перводим на новое начало
                          x=1;
                          y=3;
                         }                 
//            x++;
//            zzz++;
//}
 
 
 
for (x=1,y=1;y<=n;x++){ // выводим вторую матрицу на экран
cout<<setw(qwerty)<<mas[x][y]<<" ";
         
        if(x==m){
                 x=0;
                 y++;
                 cout<<endl;
                 }
        }
getch();
return 0;
}
Если кто поможет-спасибо. Нет - понимаю. То что я написал наверное хрен прочтешь)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2010, 10:02     решение системы уравнений методом Гауса
Посмотрите здесь:

Решение системы уравнений компактным методом исключений C++
C++ Решение системы линейных уравнений методом главных элементов
C++ Решение системы линейных уравнений матричным методом
Решение системы дифференциальных уравнений методом Эйлера C++
C++ Решение системы линейных алгебраических уравнений методом Гаусса
C++ Решение системы из двух нелинейных уравнений методом Ньютона
C++ Решение системы нелинейных уравнений методом Ньютона (С/С++)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
29.04.2013, 17:39     решение системы уравнений методом Гауса #2
MrGluck, Если система имеет ровно 1 решение, то вот:
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
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <stack>
#include <deque>
#include <set>
#include <string>
#include <limits>
#include <fstream>
 
using namespace std;
 
int main(){
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    int n;
    cin >> n;
    vector < vector <double> > a(n, vector <double> (n+1, 0));  
    for (int i = 0; i < n; i++){
        for (int j = 0; j <= n; j++){
            cin >> a[i][j];
        }
    }   
    for (int i = 0; i < n; i++){
        int row = i;
        int mx = a[i][i];
        for(int k = i+1; k < n; k++){
            if (abs(a[k][i]) > mx){
                row = k;
                mx = abs(a[k][i]);
            }
        }
        swap(a[row], a[i]);
        for (int j = i+1; j < n; j++){
            double e = a[j][i]/a[i][i];
            for (int k = i; k <= n; k++){
                a[j][k] -= e*a[i][k];
            }
        }
    }
    vector <double> ans(n);
    for (int i = n-1; i >= 0; i--){
        double sum = a[i][n];
        for (int j = i; j < n; j++){
            sum -= a[i][j]*ans[j];
        }
        ans[i] = sum/a[i][i];
    }
    for (int i = 0; i < n; i++){
        printf("%.20lf ", ans[i]);
    }
    return 0;
}
Yandex
Объявления
29.04.2013, 17:39     решение системы уравнений методом Гауса
Ответ Создать тему
Опции темы

Текущее время: 13:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru