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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
#1

Ошибка в коде.Метод зейделя - C++

10.05.2014, 05:41. Просмотров 460. Ответов 13
Метки нет (Все метки)

Соственно проблема в том, что она работает где-то до окончания do вылетает с ошибкой, если кто-то видит где ошибка напишите пожалуйста
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
#include <math.h>
#include <iostream>
#include <iomanip>
using namespace std;
main()
{
    setlocale(0, "");
    int i,j,n,it,m,k;
    double E,s,w,de,d;
         cout << "ââåäèòå ÷èñëî Г*åèçâåñòГ*ûõ: ";
         cin >> m;
         n=m;
         m+=1;
    float **matrix = new float *[n];
        for (i=0; i<n ;i++)
            matrix[i]=new float[m];
            
    float *X=new float [n];
    cout << "Ââåäèòå Г¬Г*òðèöó\n";
    for (i=0; i<n; i++)
        for (j=0; j<m; j++)
        {
            cout << "ÝëåìåГ*ГІ " << "[" << i+1 << " , " << j+1 << "]= "  ;
            cin >> matrix[i][j];
        }
      for (i=0; i<n; i++)
       {
          for (j=0; j<m; j++)
            cout << matrix[i][j] << "\t";
        cout << endl;
       }
    cout << endl;
     cout << "Ââåäèòå òî÷Г*îñòü\n";
     cin >> E;
     cout << "Ââåäèòå ðåëГ*ГЄГ±Г*öèþ\n";
     cin >> w;
        for(i=0; i<=n; i++)
        {
         X[i]=1;
        }
    it=0;
    do
     {      
         de=0;
        for(i=0; i<=n; i++)
        {  
            s=matrix[i][m];
                for(j=0;j<=i-1;j++)
                    if (j==i)
                    j++;
                    else
                    s-=matrix[i][j]*X[j];
                    
                s/=matrix[i][i];
                s=w*s+(1-w)*X[i];
                d=fabs(X[i]-s);
                X[i]=s;
                    if(d>de) 
                        de=d;
        }    
    for(i=0;i<=n;i++)
     {
        cout << "x["<<i<<"]=" << X[i] << endl;
     }
        it++;
    }       
        while((it!=100)||(de!=E));
}
Добавлено через 19 минут
Прошу прощения ошибся.Вылет после первого цикла for в операторе do while
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2014, 05:41     Ошибка в коде.Метод зейделя
Посмотрите здесь:

C++ метод Зейделя
Метод Зейделя C++
СЛАУ метод Зейделя C++
Метод Зейделя, работает неправильно C++
C++ Метод Зейделя
C++ Метод Зейделя в С++
Метод Зейделя C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ev_Hyper
Заблокирован
10.05.2014, 07:57     Ошибка в коде.Метод зейделя #2
andryshka, 45 строка - у вас выход за границу массива. Замените на:
C++
1
for(i=0; i<n; i++)
В 37, 61 строках тоже.

Цитата Сообщение от andryshka Посмотреть сообщение
C++
1
for(j=0;j<=i-1;j++)
этот цикл перепроверьте

Правильность алгоритма не проверял - нет тестового примера.
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
10.05.2014, 08:40  [ТС]     Ошибка в коде.Метод зейделя #3
Новая проблема...Поправил обе строки следуя рекомендации выше, но теперь не выводятся результаты.Попробовал убрать цикл с выводом Х и всё рабоетает, а вот даже простейшее
cout << X[i] вводит программу в ступор.
Ev_Hyper
Заблокирован
10.05.2014, 09:16     Ошибка в коде.Метод зейделя #4
andryshka, если дадите тестовый пример, я смогу посмотреть по алгоритму.
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
10.05.2014, 12:55  [ТС]     Ошибка в коде.Метод зейделя #5
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
если дадите тестовый пример, я смогу посмотреть по алгоритму.
Тестовые входные выходные данные или тестовый работающий код?
Ev_Hyper
Заблокирован
10.05.2014, 13:01     Ошибка в коде.Метод зейделя #6
andryshka, естественно входные данные
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
10.05.2014, 13:13  [ТС]     Ошибка в коде.Метод зейделя #7
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
andryshka, естественно входные данные
Да мне бы вывод решений поправить, чтобы хоть выводило решения ,а не слетало на пол пути, алгоритм мне не сложно переписать, если ошибки будут.
Ev_Hyper
Заблокирован
10.05.2014, 13:18     Ошибка в коде.Метод зейделя #8
я понимаю, но ведь насколько мне известно сходимость алгоритма проблематична для некоторых видов СЛАУ. Зная тестовый пример, тот который уже точно посчитан этим методом(например, из литературы) проверить алгоритм будет гораздо проще.
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
10.05.2014, 13:27  [ТС]     Ошибка в коде.Метод зейделя #9
вот есть данные:
a[1][1]=-2.17; a[1][2]=1; a[1][3]=0; a[1][4]=0; a[1][5]=0; b[1]=0; X[0]=1;
a[2][1]=1; a[2][2]=-2; a[2][3]=1; a[2][4]=0; a[2][5]=0; b[2]=6; X[1]=1;
a[3][1]=0; a[3][2]=1; a[3][3]=-2; a[3][4]=1; a[3][5]=0; b[3]=6; X[2]=1;
a[4][1]=0; a[4][2]=0; a[4][3]=1; a[4][4]=-2; a[4][5]=1; b[4]=6; X[3]=1;
a[5][1]=0; a[5][2]=0; a[5][3]=0; a[5][4]=1; a[5][5]=-2.17; b[5]=0; X[4]=1;
Решение:
X[1]=-7.69231
X[2]=-16.6923
X[3]=-19.6923
X[4]=-16.6923
X[5]=-7.69231

Добавлено через 1 минуту
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Зная тестовый пример, тот который уже точно посчитан этим методом
вот такой есть.
Ev_Hyper
Заблокирован
10.05.2014, 13:28     Ошибка в коде.Метод зейделя #10
andryshka, релаксация для них какая?
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
10.05.2014, 13:29  [ТС]     Ошибка в коде.Метод зейделя #11
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
релаксация
единица, она тут пока чисто номинально, ибо я точно ещё не знаю когда нужна верхняя, а когда нижняя релаксация.
Ev_Hyper
Заблокирован
11.05.2014, 13:55     Ошибка в коде.Метод зейделя #12
andryshka, вечером посмотрю, попробую исправить.
Но в while исправьте с :
C++
1
while((it!=100)||(de!=E));
на
C++
1
 while(it!=100 && de!=0.1);
Для ускорения поиска ошибки, запускайте тестовый пример. Входные данные, для вставки в консоль под спойлером:
Кликните здесь для просмотра всего текста

Код
5
-2.17
1
0
0
0
0
1
-2
1
0
0
6
0
1
-2
1
0
6
0
0
1
-2
1
6
0
0
0
1
-2.17
0
0.1
1


Добавлено через 23 часа 13 минут
andryshka, s это значения с предыдущей итерации, а x - с текущей?

Добавлено через 21 минуту
andryshka, вы уверены, что ваш пример "рабочий"?
Проверил на другом тестовом примере:
Код
введите число неизвестных: 4
Введите матрицу
Элемент [1 , 1]= 3
Элемент [1 , 2]= 0
Элемент [1 , 3]= 0
Элемент [1 , 4]= -3
Элемент [1 , 5]= 21
Элемент [2 , 1]= 0
Элемент [2 , 2]= 11
Элемент [2 , 3]= 1
Элемент [2 , 4]= 2
Элемент [2 , 5]= 21
Элемент [3 , 1]= 1
Элемент [3 , 2]= 0
Элемент [3 , 3]= 5
Элемент [3 , 4]= 0
Элемент [3 , 5]= 48
Элемент [4 , 1]= -1
Элемент [4 , 2]= 2
Элемент [4 , 3]= 7
Элемент [4 , 4]= 11
Элемент [4 , 5]= 61
3       0       0       -3      21
0       11      1       2       21
1       0       5       0       48
-1      2       7       11      61

Введите точность
0.1
Введите релаксацию
1
x[0]=8
x[1]=1
x[2]=8
x[3]=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
int main()
{
    setlocale(0, "");
    int i,j,n,it,m,k;
    double E,s,w,de,d;
         cout << "введите число неизвестных: ";
         cin >> m;
         n=m;
         m+=1;
    double **matrix = new double *[n];
        for (i=0; i<n ;i++)
            matrix[i]=new double[m];
            
    double *X=new double [n];
    double *S = new double[n];
    cout << "Введите матрицу\n";
    for (i=0; i<n; i++)
        for (j=0; j<m; j++)
        {
            cout << "Элемент " << "[" << i+1 << " , " << j+1 << "]= "  ;
            cin >> matrix[i][j];
        }
      for (i=0; i<n; i++)
       {
          for (j=0; j<m; j++)
            cout << matrix[i][j] << "\t";
        cout << endl;
       }
    cout << endl;
     cout << "Введите точность\n";
     cin >> E;
     cout << "Введите релаксацию\n";
     cin >> w;
        for(i=0; i<n; i++)
         X[i]=0;
 
    it=0;
    do
     {      
        for(i=0; i<n; i++)
        {  
            S[i] = matrix[i][m-1];
                for(j=0;j<n;j++)
                    if (j!=i){
                    S[i]-=matrix[i][j]*X[j];
                    }
                S[i]/=matrix[i][i];
        }    
 
        it++;
        int error =0;
        for (int i = 0; i < n; i++)
            error += abs (X[i] - S[i]);
        // Если необходимая точность достигнута, то завершаем процесс       
        if (error < E)
        {
            break;
        }
 
        for(int j=0;j<n;j++){
            X[j]=S[j];
        }
 
    }       
        while(it!=100);
        
            for(i=0;i<n;i++)
     {
        cout << "x["<<i<<"]=" << X[i] << endl;
     }
        return 0;
}
Вариант НЕ окончательный, результаты мне не нравятся, поэтому чуть позже еще раз просмотру алгоритм.
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
11.05.2014, 16:44  [ТС]     Ошибка в коде.Метод зейделя #13
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Вариант НЕ окончательный, результаты мне не нравятся, поэтому чуть позже еще раз просмотру алгоритм.
У меня проблема оставалось именно в выводе, а вот теперь есть вывод пойду посмотрю алгоритм.Спасибо вам за помощь.Можно поинтересоваться почему не выводились данные?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2014, 07:24     Ошибка в коде.Метод зейделя
Еще ссылки по теме:

C++ метод Зейделя. c++
C++ Метод Зейделя
C++ Метод Зейделя-Гаусса С++
Метод Гаусса-Зейделя C++
C++ Ошибка в коде, использующем метод золотого сечения

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

Или воспользуйтесь поиском по форуму:
Ev_Hyper
Заблокирован
12.05.2014, 07:24     Ошибка в коде.Метод зейделя #14
Цитата Сообщение от andryshka Посмотреть сообщение
Спасибо вам за помощь.Можно поинтересоваться почему не выводились данные?
andryshka, Конечно, у вас был бесконечный цикл do-while:

C++
1
while((it!=100)||(de!=E));
при таком условии выход будет только если и то, и другое выполняеться.
Если условие выхода изменить на:
C++
1
 while(it!=100 && de!=0.1);
то цикл прекратиться, если хотя бы одно из условий перестанет выпоняться
Yandex
Объявления
12.05.2014, 07:24     Ошибка в коде.Метод зейделя
Ответ Создать тему
Опции темы

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