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

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

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

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

10.05.2014, 05:41. Просмотров 509. Ответов 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
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2014, 05:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в коде.Метод зейделя (C++):

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

Ошибка в коде, использующем метод золотого сечения - C++
В общем одна единственная ошибка #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; using namespace...

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

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

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

Метод Зейделя - 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++)
этот цикл перепроверьте

Правильность алгоритма не проверял - нет тестового примера.
1
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
10.05.2014, 08:40  [ТС] #3
Новая проблема...Поправил обе строки следуя рекомендации выше, но теперь не выводятся результаты.Попробовал убрать цикл с выводом Х и всё рабоетает, а вот даже простейшее
cout << X[i] вводит программу в ступор.
0
Ev_Hyper
Заблокирован
10.05.2014, 09:16 #4
andryshka, если дадите тестовый пример, я смогу посмотреть по алгоритму.
0
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
10.05.2014, 12:55  [ТС] #5
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
если дадите тестовый пример, я смогу посмотреть по алгоритму.
Тестовые входные выходные данные или тестовый работающий код?
0
Ev_Hyper
Заблокирован
10.05.2014, 13:01 #6
andryshka, естественно входные данные
0
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
10.05.2014, 13:13  [ТС] #7
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
andryshka, естественно входные данные
Да мне бы вывод решений поправить, чтобы хоть выводило решения ,а не слетало на пол пути, алгоритм мне не сложно переписать, если ошибки будут.
0
Ev_Hyper
Заблокирован
10.05.2014, 13:18 #8
я понимаю, но ведь насколько мне известно сходимость алгоритма проблематична для некоторых видов СЛАУ. Зная тестовый пример, тот который уже точно посчитан этим методом(например, из литературы) проверить алгоритм будет гораздо проще.
0
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 Посмотреть сообщение
Зная тестовый пример, тот который уже точно посчитан этим методом
вот такой есть.
0
Ev_Hyper
Заблокирован
10.05.2014, 13:28 #10
andryshka, релаксация для них какая?
0
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
10.05.2014, 13:29  [ТС] #11
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
релаксация
единица, она тут пока чисто номинально, ибо я точно ещё не знаю когда нужна верхняя, а когда нижняя релаксация.
0
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;
}
Вариант НЕ окончательный, результаты мне не нравятся, поэтому чуть позже еще раз просмотру алгоритм.
0
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
11.05.2014, 16:44  [ТС] #13
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Вариант НЕ окончательный, результаты мне не нравятся, поэтому чуть позже еще раз просмотру алгоритм.
У меня проблема оставалось именно в выводе, а вот теперь есть вывод пойду посмотрю алгоритм.Спасибо вам за помощь.Можно поинтересоваться почему не выводились данные?
0
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);
то цикл прекратиться, если хотя бы одно из условий перестанет выпоняться
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2014, 07:24
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.05.2014, 07:24
Ответ Создать тему
Опции темы

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