Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
1

Метод Зейделя-Гаусса С++

08.03.2015, 14:04. Показов 4170. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Для написания программы, решающей систему линейных уравнения методом итерации или Зейделя, использовалась среда разработки Visual Studio 2010. Задание стояло такое: написать прогу которая уточняла приближение знаков(решения) матрици до 8 знаков. Но возникла ошибка ту матрицу которую мне надо не решает т_Т.
Я создал новый проект пустой проект и добавим в него файл исходного кода — main.cpp со следующим содержимым
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
#include <iostream>
#include <cmath>
#include "norm.h"
#include "iterat.h"
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "");
    double eps, A[10][10], B[10];
    int N, i, j;
    int method;
    cout << "Введите размер квадратной матрицы: ";
    cin >> N;
    cout << "Введите точность вычислений: ";
    cin >> eps;
    cout << "Заполните матрицу А: " << endl << endl;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            cout << "A[" << i << "][" << j << "] = ";
            cin >> A[i][j];
        }
    }
    cout << "\nВаша матрица А:" << endl;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            cout << A[i][j] << " ";
        }
        cout << endl;
    }
    cout << "\nЗаполните столбец свободных членов: " << endl;
    for (i = 0; i < N; i++) {
        cout << "В[" << i+1 << "] = ";
        cin >> B [i];
    }
    cout << "\nВыберите метод решения системы (1 - Гаусс / 2 - Зейдель): "; 
    cin >> method;
    cout << endl;
    iterat(A,B,N,eps,method);
    return 0;
}
Потом создал заголовочный файл norm.h, содержащий прототипы функций, вычисляющих нормы матрицы, и iterat.h, содержащий прототип функции iterat(), которая считает количество итераций.
norm.h
C++
1
2
3
double firstNorm(double [10][10], int n, int m);
double secondNorm(double [10][10], int n, int m);
double thirdNorm(double [10][10], int n, int m);
iterat.h
C++
1
double iterat(double A[10][10], double B[10], int N, double eps, int method);
Добавим в проект третий заголовочный файл okr.h — в нем будет находиться прототип функции округления
C++
1
double okr(double X, double eps);
Добавлено через 1 минуту
Создадал еще три файла — norm.cpp, iterat.cpp и okr.cpp
norm.cpp
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
#include <cmath>
 
double firstNorm(double  A[10][10],  int n, int m)
{
    int i, j;
    double sum = 0, subSum;
    for (i = 0; i < n; i++) {
        subSum = 0;
        for (j = 0; j < m; j++) {
            subSum += abs(A[i][j]);
        }
        if(subSum > sum) {
            sum = subSum;
        }
    }
    return sum;
}
 
double secondNorm(double  A[10][10], int n, int m)
{
    int i, j;
    double sum = 0, subSum;
    for (j = 0; j < n; j++) {
        subSum = 0;
        for (i = 0; i < m; i++) {
            subSum += abs(A[i][j]);
        }
        if(subSum > sum) {
            sum = subSum;
        }
    }
    return sum;
}
 
double thirdNorm(double A[10][10], int n, int m)
{
    int i, j;
    double sum = 0;
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            sum += (A[i][j] * A[i][j]);
        }
    }
    sum = sqrt(sum);
    return sum;
}
iterat.cpp
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
#include <iostream>
#include <cmath>
#include "norm.h"
#include "okr.h"
 
using namespace std;
 
double iterat(double A[10][10], double B[10], int N, double eps, int method)
{
    if (thirdNorm(A, N, N) < 1) {
        int k = 0;
        int i, j;
        double X[10];
        double Y[10];
        double s;
        double g;
 
        for(i = 0; i < N; i++) {
            X[i] = B[i];
        }
        do {
            s = 0; k++;
            if (method != 1 && method != 2) {
                while (method != 1 && method != 2) {
                    cerr << "Неверное значение!" << endl;
                    cout << "\nВыберите метод решения системы (1 - Гаусс / 2 - Зейдель): ";
                    cin >> method;
                    cout << endl;
                }
            }
            if (method == 1) { // Решаем систему методом Гаусса.
                for (i = 0; i < N; i++) {
                    Y[i] = B[i];
                    for (j = 0; j < N; j++) {
                        Y[i] = Y[i] + A[i][j] * X[j];
                    }
                    s += (X[i] - Y[i]) * (X[i] - Y[i]);
                }
                for (i = 0; i < N; i++) {
                    X[i] = Y[i];
                }
            } else if (method == 2) { // Решаем систему методом Зейделя.
                for (i = 0; i < N; i++) {
                    g = B[i];
                    for (j = 0; j < N; j++) {
                        g = g + A[i][j] * X[j];
                    }
                    s += (X[i] - g) * (X[i] - g);
                    X[i] = g;
                }
             }
        } while (sqrt(s) >= eps * (1 - thirdNorm(A, N, N)) / thirdNorm(A, N, N));
 
        if (method == 1 || method == 2) {
            cout << "Решение системы:" << endl;
            for (i = 0; i < N; i++) {
                cout << "X" << i << " = " << okr(X[i],eps) << endl;
            }
            cout << "Число итераций: " << k-1 << endl;
            cout << "Первая норма матрицы A: " << firstNorm(A,N,N) << endl;
            cout << "Вторая норма матрицы A: " << secondNorm(A,N,N) << endl;
            cout << "Третья норма матрицы A: " << thirdNorm(A,N,N) << endl;
        }
 
    } else {
        cerr << "Условие сходимости по евклидовой метрике не выполняется!" << endl;
    }
 
    return 0;
}
okr.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cmath>
 
using namespace std;
 
double okr(double X, double eps)
{
    int i = 0;
    while (eps != 1) {
        i++;
        eps *= 10;
    }
    int okr = pow(double(10), i);
    X = int(X * okr + 0.5) / double(okr);
    return X;
}
Добавлено через 3 минуты
Но почему то не хочет решать мою матрицу(на рисунке). В чем дело?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2015, 14:04
Ответы с готовыми решениями:

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Метод Гаусса-Зейделя
Здравствуйте. Задание дали нормальное такое) Вообще не понимаю что хотят. Объясните пожалуйста...

Метод Гаусса-Зейделя: неверный результат
Здравствуйте. Я вот написал(точнее фрагмент взял с Википедии) программу решения СЛАУ методом...

Метод Гаусса-Зейделя для решения СЛАУ
Дана система СЛАУ, которая уже приведена к нормальному виду, то есть ничего преображать не нужно....

2
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
08.03.2015, 14:07  [ТС] 2
Вот рисунок
Изображения
 
0
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
08.03.2015, 14:18  [ТС] 3
Пишет что (Условие сходимости по евклидовой метрике не выполняется) и что мне делать как изменить так что бы робило =) Я ламер полный. Так что прошу подскажите где изменить условие что бы получилось в ответе:
x1 = - 0.67176134
x2 = 1.64525532
x3 = -1.78508054
x4 = 1.56997139
0
08.03.2015, 14:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2015, 14:18
Помогаю со студенческими работами здесь

Распараллелить метод Зейделя-Гаусса используя OpenMP
Сама программа вот: #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;math.h&quot; #include...

Уравнение Лапласа методом Гаусса-зейделя
Добрый день,подскажите пожалуйста правильно ли делаю,решаю уравнение лапласа с граничными условиями...

Параллельный алгоритм, решенный методом Гаусса-Зейделя
Всем привет.;)Нашла в инете текст программы, кот. мне нужна.Написана она на С++(параллельный...

Метод итераций и метод Зейделя
Здравсвуйте программисты! Спасибо всем за помощь в предыдущих темах, осталась последняя лаба,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru