Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 13

Метод Зейделя

30.04.2018, 23:06. Показов 1917. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Где-то ошибка в расчетах, вечно вылазит ошибка сходимости. Если закомментировать сходимость, считается вообще непонятно что. Не пойду где именно эта ошибка и как ее исправить

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
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);

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;
}
Добавлено через 12 часов 54 минуты
Так кто-то сможет помочь?
Если с этим кодом совсем беда, напишите свой вариант. Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.04.2018, 23:06
Ответы с готовыми решениями:

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

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

Метод Зейделя в С++
всем доброго времени суток... у меня такая проблема, есть программа по решению систем линейных уравнений методом Зейделя написали мне...

2
 Аватар для ПерС
587 / 490 / 371
Регистрация: 05.11.2013
Сообщений: 1,271
Записей в блоге: 6
01.05.2018, 07:34
Эти методы - итерационные. Учитываешь, что для сходимости матрица должна иметь диагональное преобладание?
Вот например в Маткаде решение Гаусс-Зейделем
0
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 13
01.05.2018, 12:15  [ТС]
Я не знаю, как это можно реализовать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.05.2018, 12:15
Помогаю со студенческими работами здесь

Метод Зейделя
Ребята, каждый из вас уже делал лабы по матрицам. Если у кого-то есть готовая лаба по методу Зейделя, прошу, напишите ее тут и желательно с...

Метод Зейделя:
Здравствуйте, у меня получается на данный момент X1 := -8.32587e+307 X2 := -inf X3 := inf я скопировал сам метод зейделя с...

Метод Зейделя
ошибка найдена. тема закрыта

Метод Зейделя
решить систему нелинейных уравнений Методом зейделя:

Метод Зейделя
Я написал прогу по методу Зейделя, так вот при матрице 3х3 выдает после 7 итерации правильный ответ) а при матрице 4х4 уже на второй...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru