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

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

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

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

10.05.2014, 05:41. Просмотров 491. Ответов 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++
В общем одна единственная ошибка #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; using namespace...

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

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

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

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

метод Зейделя - C++
Ребят помогите пожалуйста, а то зачот простаивает)Нужна программка реализующая метод Зейделя(или Зейзеля препод так написал что...

метод Зейделя. c++ - C++
В цикле do while есть ошибка, из-за неё программа не правильно считает Xold и Xnew. Помогите, пожалуйста, найти ошибку... #pragma once ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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++
Решить СЛАР методом Зейделя вида АХ=В с точностью до 0,0001. Пример на рисунке ниже что не могу не как реализовать нормально. Точнее...

Метод Зейделя-Гаусса С++ - C++
Для написания программы, решающей систему линейных уравнения методом итерации или Зейделя, использовалась среда разработки Visual Studio...

Метод Гаусса-Зейделя - 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     Ошибка в коде.Метод зейделя
Ответ Создать тему
Опции темы

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