Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
#1

Метод простых итераций для СЛАУ

03.04.2017, 03:02. Просмотров 1009. Ответов 12
Метки нет (Все метки)

Здравствуйте! Пытаюсь реализовать метод простых итераций. Все функции, которые работают нормально, кроме самих итераций. Не могу понять, что не так. Подскажите в чем ошибка, пожалуйста.
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
137
138
139
140
141
142
143
144
145
#include <iostream>
#include <iomanip>
#include <cmath>
#define e 0,005
using namespace std;
class Matr
{
private:
    int size;
    double **mas;
    double *mas1;
public:
    Matr()
    {
        size = 0;
        mas = NULL;
        mas1 = NULL;
    }
    Matr(int l)
    {
        size = l;
        mas = new double*[l];
        for (int i = 0; i < l; i++)
            mas[i] = new double[l];
        mas1 = new double[l];
    }
    void Add()
    {
        for (int i = 0; i < size; i++)
            for (int j = 0; j < size; j++)
                cin >> mas[i][j];
        for (int i = 0; i < size; i++)
        {
            cin >> mas1[i];
        }
 
    }
    void Print()
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout << setw(4) << mas[i][j] << " ";
            }
            cout << " " << mas1[i] << endl;
        }
    }
    void Preob()
    {
        double temp = 0;
        for (int k = 0; k < size; k++)
        {
            for (int i = 0; i < size; i++)
            {
                temp = mas[i][i]*(-1);
                mas1[i] /= temp;
                for (int j = 0; j <= size; j++)
                {
                    mas[i][j] /= temp;
                }
            }
        }
            for (int i = 0; i < size; i++)
            {
                mas1[i] *= -1;
                for (int j = 0; j < size; j++)
                    mas[i][i] = 0;
            }
    }
    double Norma()
    {
        double sum = 0, max = 0;
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    sum += fabs(mas[i][j]);
                    if (sum > max) max = sum;
                }
                sum = 0;
            }
            return max;
    }
    double Pogr()
    {
        double eps = 0;
        double norm = Norma();
        if (norm >= 1) cout << "Метод может оказаться несходимым" << endl;
        else eps = (1 - norm) / norm;
        return eps;
    }
    void Itera()
    {
        double *x = new double[size];
        double *x0 = new double[size];
        double *E = new double[size];
        double max = 0;
        for (int i = 0; i < size; i++)
            x0[i] = mas1[i];
        do
        {
            for (int i = 0; i < size; i++)
            {
                x[i] = 0;
                for (int j = 0; j < size; j++)
                {
                    x[i] += mas[j][i] * mas1[j];
                }
                x[i] += mas1[i];
                E[i] = fabs(x[i] - x0[i]);
            }
            max = 0;
            for (int i = 0; i < size; i++)
            {
                if (max <= E[i]) max = E[i]; x0[i] = x[i];
            }
        } while (max < Pogr());
        for (int i = 0; i < size; i++)
            cout << "x" << i + 1 << "=" << x[i] << " " << endl;
        delete[] x;
        delete[] x0;
        delete[] E;
    }
};
int main()
{
    setlocale(LC_ALL, "rus");
    int n;
    cout << "Введите количество уравнений:   ";
    cin >> n;
    Matr a(n);
    cout << "Введите матрицу коэффициентов, потом столбец свободных членов:" << endl;
    a.Add();
    cout << endl << "Расширенная матрица:" << endl;
    a.Print();
    a.Preob();
    cout << endl << "Преображенная матрица" << endl;
    a.Print();
    cout << endl;
    a.Itera();
    cout << endl;
    system("pause");
    return 0;
}
Добавлено через 5 часов 54 минуты
Просто помочь разобраться с этой функцией...
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
void Itera()
    {
        double *x = new double[size];
        double *x0 = new double[size];
        double *E = new double[size];
        double max = 0;
        for (int i = 0; i < size; i++)
            x0[i] = mas1[i];
        do
        {
            for (int i = 0; i < size; i++)
            {
                x[i] = 0;
                for (int j = 0; j < size; j++)
                {
                    x[i] += mas[j][i] * mas1[j];
                }
                x[i] += mas1[i];
                E[i] = fabs(x[i] - x0[i]);
            }
            max = 0;
            for (int i = 0; i < size; i++)
            {
                if (max <= E[i]) max = E[i]; x0[i] = x[i];
            }
        } while (max < Pogr());
        for (int i = 0; i < size; i++)
            cout << "x" << i + 1 << "=" << x[i] << " " << endl;
        delete[] x;
        delete[] x0;
        delete[] E;
    }
Добавлено через 1 час 30 минут
Заметила ошибку ещё в 90-той строке, там должно быть
C++
1
else eps = ((1 - norm) / norm)*e;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2017, 03:02
Ответы с готовыми решениями:

Метод простых итераций для СЛАУ
Прошу помочь с написанием МПИ для СЛАУ на C. Каким образом выразить из AX=b...

Метод простых итераций для СЛАУ
Доброго времени суток всем!!! решаю СЛАУ методом простых итераций, проблема...

Метод простых итераций для СЛАУ
Помогите пожалуйста! Нужно реализовать метод простых итераций для решения СЛАУ...

Метод простых итераций для решения СЛАУ
Здравствуйте. Есть функция, реализующая метод простых итераций: void...

Метод простых итераций для решения СЛАУ
Всем добрый вечер! Столкнулся с заданием на тему решения СЛАУ методом простых...

12
likehood
950 / 803 / 385
Регистрация: 25.12.2016
Сообщений: 2,658
Завершенные тесты: 3
03.04.2017, 08:20 #2
Цитата Сообщение от vivatverum Посмотреть сообщение
Все функции, которые работают нормально, кроме самих итераций.
В чём проявляется ненормальность работы функции Itera?
0
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
03.04.2017, 15:37  [ТС] #3
Она неправильно выдает результат. Совсем другие иксы, а не те, что должны получиться.
0
likehood
950 / 803 / 385
Регистрация: 25.12.2016
Сообщений: 2,658
Завершенные тесты: 3
03.04.2017, 16:19 #4
Если не ошибаюсь, мы используем формулу X = AX + B. Где хранятся A и B в программе?
0
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
03.04.2017, 16:52  [ТС] #5
Да, у меня А - это mas, а В - mas1. Динамические массивы типа double.
0
likehood
950 / 803 / 385
Регистрация: 25.12.2016
Сообщений: 2,658
Завершенные тесты: 3
03.04.2017, 16:56 #6
Тогда непонятна 16 строка:
C++
1
x[i] += mas[j][i] * mas1[j];
Зачем мы перемножаем A и B?
0
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
03.04.2017, 17:00  [ТС] #7
Вот же... Я хотела взять начальное приближение как В, но не записала это в отдельный массив, а записала так. Конечно оно не правильно считать, переделаю сейчас.
0
likehood
950 / 803 / 385
Регистрация: 25.12.2016
Сообщений: 2,658
Завершенные тесты: 3
03.04.2017, 17:04 #8
Цитата Сообщение от vivatverum Посмотреть сообщение
Я хотела взять начальное приближение как В, но не записала это в отдельный массив
Одна из причин ошибки - неудачные имена mas и mas1. Почему бы не использовать естественные имена A и B?
0
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
03.04.2017, 17:15  [ТС] #9
Пожалуй, стоило бы действительно назвать получше. Только вот даже заметив эту ошибку правильного результата нет. Цикл делает лишь один проход почему-то. Может тогда не в самой функции проблема, может условие не так работает.. Правильно ли записывать его так?
C++
1
while (max < Pogr());
0
likehood
950 / 803 / 385
Регистрация: 25.12.2016
Сообщений: 2,658
Завершенные тесты: 3
03.04.2017, 17:20 #10
Цитата Сообщение от vivatverum Посмотреть сообщение
Правильно ли записывать его так?
Не знаю, надо смотреть описание метода. Возможно, нужен знак больше.
0
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
03.04.2017, 17:35  [ТС] #11
Кажется я поняла. Скорее всего с той же функцией Pogr() и проблемы. Там что-то очень нечисто я написала. Сейчас разбираюсь и пробую переделывать. А по методу, как раз таки должен знак меньше. Итерации оканчиваются тогда, когда модуль разницы между Хк и Хк-1 становиться меньше посчитанной погрешности.
0
likehood
03.04.2017, 17:44
  #12

Не по теме:

Сам по себе метод весьма коварен, хоть и кажется простым. У нас в своё время вся группа не могла решить эту задачу несколько недель. Но потом как-то разобрались.

0
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
03.04.2017, 18:58  [ТС] #13
Рабочий код.
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream>
#include <iomanip>
#include <cmath>
#define e 0.005
using namespace std;
class Matr
{
private:
    int size;
    double **mas;
    double *mas1;
public:
    Matr()
    {
        size = 0;
        mas = NULL;
        mas1 = NULL;
    }
    Matr(int l)
    {
        size = l;
        mas = new double*[l];
        for (int i = 0; i < l; i++)
            mas[i] = new double[l];
        mas1 = new double[l];
    }
    void Add()
    {
        for (int i = 0; i < size; i++)
            for (int j = 0; j < size; j++)
                cin >> mas[i][j];
        for (int i = 0; i < size; i++)
        {
            cin >> mas1[i];
        }
 
    }
    void Print()
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout << setw(4) << mas[i][j] << " ";
            }
            cout << " " << mas1[i] << endl;
        }
    }
    void Preob()
    {
        double temp = 0;
        for (int k = 0; k < size; k++)
        {
            for (int i = 0; i < size; i++)
            {
                temp = mas[i][i]*(-1);
                mas1[i] /= temp;
                for (int j = 0; j <= size; j++)
                {
                    mas[i][j] /= temp;
                }
            }
        }
            for (int i = 0; i < size; i++)
            {
                mas1[i] *= -1;
                for (int j = 0; j < size; j++)
                    mas[i][i] = 0;
            }
    }
    double Norma(double **mas)
    {
        double sum = 0, max = 0;
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    sum += fabs(mas[i][j]);
                    if (sum > max) max = sum;
                }
                sum = 0;
            }
            return max;
    }
    double Pogr()
    {
        double eps = 0;
        double norm = Norma(mas);
        eps = ((1 - norm) / norm)*e;
        return eps;
    }
    void Itera()
    {
        double *x = new double[size];
        double *x0 = new double[size];
        double *E = new double[size];
        double max = 0, per = 0;
        per = Pogr();
        for (int i = 0; i < size; i++)
            x0[i] = mas1[i];
        int counter = 0;
        do
        {
            for (int i = 0; i < size; i++)
            {
                x[i] = 0;
                for (int j = 0; j < size; j++)
                {
                    x[i] += mas[i][j] * x0[j];      
                }
                x[i] += mas1[i];
                E[i] = fabs(x[i] - x0[i]);
            }
            max = 0;
            for (int i = 0; i < size; i++)
            {
                if (max < E[i]) max = E[i]; 
                x0[i] = x[i];
            }
            cout<<endl << "max = " << max;
            counter++;
        } while (max > per);
        cout << endl << "Количество итераций: " << counter << endl;
        for (int i = 0; i < size; i++)
            cout << "x" << i + 1 << "=" << x[i] << " " << endl;
        delete[] x;
        delete[] x0;
        delete[] E;
    }
};
int main()
{
    setlocale(LC_ALL, "rus");
    int n;
    cout << "Введите количество уравнений:   ";
    cin >> n;
    Matr a(n);
    cout << "Введите матрицу коэффициентов, потом столбец свободных членов:" << endl;
    a.Add();
    cout << endl << "Расширенная матрица:" << endl;
    a.Print();
    a.Preob();
    cout << endl << "Преображенная матрица" << endl;
    a.Print();
    cout << endl;
    a.Itera();
    cout << endl;
    system("pause");
    return 0;
}
0
03.04.2017, 18:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2017, 18:58

Метод простых итераций для решения СЛАУ
Здравствуйте. Попытался сделать программу для решения СЛАУ методом простых...

Метод простых итераций для решения СЛАУ
Доброго времени суток. Если у кого нибудь есть готовые программы для данного...

Алгоритм написания для решения СЛАУ методом простых итераций
Прошу помощи в написании программы для решения СЛАУ методом итераций. Нет, я не...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru