0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 2
1

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

22.11.2016, 21:51. Показов 11139. Ответов 2
Метки нет (Все метки)

Всем добрый вечер!
Столкнулся с заданием на тему решения СЛАУ методом простых итераций и Зейделя.
В итоге завис с первым методом: делаю прямо, как говорится "в лоб", но цикл проходит только один раз, а почему - не пойму Бьюсь с этим уже вторую неделю, но предполагаю, что ошибка будет наитупейшей, но лично я ее уже не вижу. Возможно, кто-то сможет помочь?
Код прикрепляю.
C++ (Qt)
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
#include <iostream>
#include <cmath>
 
 
using namespace std;
int main()
{
    double a11 = -19, a12 = 2, a13 = -1, a14 = -8;  // матрица 
    double a21 = 2, a22 = 14, a23 = 0, a24 = -4;
    double a31 = 6, a32 = -5, a33 = -20, a34 = -6;
    double a41 = -6, a42 = 4, a43 = -2, a44 = 15;
    double b1 = 38, b2 = 20, b3 = 52, b4 = 43;      // столбец свободных членов
    
    double x1 = 0, x2 = 0, x3 = 0, x4 = 0;          // начальное приближение
    double x1n, x2n, x3n, x4n;
    double eps = 0.0000000000001;
    int count;
    
    if ( fabs(a11) > fabs(a12) + fabs(a13) + fabs(a14) &&
         fabs(a22) > fabs(a21) + fabs(a23) + fabs(a24) &&
         fabs(a33) > fabs(a31) + fabs(a32) + fabs(a34) &&
         fabs(a44) > fabs(a41) + fabs(a42) + fabs(a43))
         cout << "Diagonal'noe preobladaniye ne narushaetsya" << endl;
    else 
    {
        cout << "Diagonal'noe preobladaniye narushaetsya" << endl;
    }
    count = 0;
    do 
    {
        x1n = (b1 - (a12*x2 + a13*x3 + a14*x4))/a11; 
        x2n = (b2 - (a21*x1 + a23*x3 + a24*x4))/a22;
        x3n = (b3 - (a31*x1 + a32*x2 + a34*x4))/a33;
        x4n = (b4 - (a41*x1 + a42*x2 + a43*x3))/a44;
        count = count + 1;
//  cout << "x1 = " << x1n << endl << "x2 = " << x2n << endl << "x3 = " << x3n << endl << "x4 = " << x4n << endl;   
    }while( fabs(x1n-x1) < eps && 
            fabs(x2n-x2) < eps && 
            fabs(x3n-x3) < eps &&
            fabs(x4n-x4) < eps);  
    x1 = x1n;
    x2 = x2n;
    x3 = x3n;
    x4 = x4n;
    cout << "Kolichestvo iter. = " << count << endl << "x1 = " << x1 << endl 
         << "x2 = " << x2 << endl << "x3 = " << x3 << endl << "x4 = " << x4 << endl;       
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2016, 21:51
Ответы с готовыми решениями:

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

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

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

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

2
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
22.11.2016, 22:03 2
Лучший ответ Сообщение было отмечено Lalalulu как решение

Решение

Lalalulu, ну по крайней мере у вас в цикле do while значения не будут меняться с увеличением числа итераций точно

Добавлено через 6 минут
Lalalulu, попробуйте так
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
#include <iostream>
#include <cmath>
 
 
using namespace std;
int main()
{
    double a11 = -19, a12 = 2, a13 = -1, a14 = -8;  // матрица 
    double a21 = 2, a22 = 14, a23 = 0, a24 = -4;
    double a31 = 6, a32 = -5, a33 = -20, a34 = -6;
    double a41 = -6, a42 = 4, a43 = -2, a44 = 15;
    double b1 = 38, b2 = 20, b3 = 52, b4 = 43;      // столбец свободных членов
    
    double x1 = 0, x2 = 0, x3 = 0, x4 = 0;          // начальное приближение
    double x1n, x2n, x3n, x4n;
    double eps = 0.0000000000001;
    int count;
    
    if ( fabs(a11) > fabs(a12) + fabs(a13) + fabs(a14) &&
         fabs(a22) > fabs(a21) + fabs(a23) + fabs(a24) &&
         fabs(a33) > fabs(a31) + fabs(a32) + fabs(a34) &&
         fabs(a44) > fabs(a41) + fabs(a42) + fabs(a43))
         cout << "Diagonal'noe preobladaniye ne narushaetsya" << endl;
    else 
    {
        cout << "Diagonal'noe preobladaniye narushaetsya" << endl;
    }
    count = 0;
    do 
    {
        x1n = (b1 - (a12*x2 + a13*x3 + a14*x4))/a11; 
        x2n = (b2 - (a21*x1 + a23*x3 + a24*x4))/a22;
        x3n = (b3 - (a31*x1 + a32*x2 + a34*x4))/a33;
        x4n = (b4 - (a41*x1 + a42*x2 + a43*x3))/a44;
        count = count + 1;
        if(fabs(x1n-x1) < eps && 
            fabs(x2n-x2) < eps && 
            fabs(x3n-x3) < eps &&
            fabs(x4n-x4) < eps) break;
        x1 = x1n;
        x2 = x2n;
        x3 = x3n;
        x4 = x4n;
        
//  cout << "x1 = " << x1n << endl << "x2 = " << x2n << endl << "x3 = " << x3n << endl << "x4 = " << x4n << endl;   
    }while(1);  
    x1 = x1n;
    x2 = x2n;
    x3 = x3n;
    x4 = x4n;
    cout << "Kolichestvo iter. = " << count << endl << "x1 = " << x1 << endl 
         << "x2 = " << x2 << endl << "x3 = " << x3 << endl << "x4 = " << x4 << endl;       
}
1
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 2
23.11.2016, 07:13  [ТС] 3
cybeuser, спасибо большое!
Единственное, если делать вывод каждой итерации в цикле, то считает 16 итерацией и числа правильные, а если делать общий вывод - 52 и числа округляет) го думаю, что это из-за точности: попробую обозначить через дёрнуты у и выводить с setprecision. Ещё раз спасибо за помощь!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2016, 07:13
Помогаю со студенческими работами здесь

Метод простых итераций для СЛАУ
Здравствуйте! Пытаюсь реализовать метод простых итераций. Все функции, которые работают нормально,...

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru