Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2017, 15:40   #1
Nadya13
Новичок
Джуниор
 
Регистрация: 15.11.2017
Сообщений: 2
По умолчанию СЛАУ методом Зейделем

Всем добрый вечер. Надо решить СЛАУ методом Зейделя. Есть код, помогите, пожалуйста, найти ошибку. Ошибка в функции converge, когда эту функцию вызываю в цикле do...while функции iteration, происходит зацикливание. Подскажите, пожалуйста, как исправить ошибку.
Код:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
double eps=0.001;
using namespace std;

bool InputFileMatr(double **A, int n)
{
    int i, j;
    FILE*f=fopen("matrix.txt", "r");
    if(!f)
        return false;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            fscanf(f, "%lf", &A[i][j]);
        }
    }
    fclose(f);
    return true;
}
bool InputFileVect(double *b, int n)
{
    int i;
    FILE *f=fopen("vector.txt", "r");
    if(!f)

        return false;
    for(i=0; i<n; i++)
    {
        fscanf(f, "%lf", &b[i]);
    }
    fclose(f);
    return true;
}
void OutputDescMatrix(double **A, int n)
{
    int i,j;
    printf("\nThe output matrix\n");
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            printf("%lf ", A[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
void OutputDescVect(double *b, int n)
{
    int i;
    printf("\nThe output vector\n");
    for(i=0; i<n; i++)
    {
        printf("%lf ", b[i]);
        printf("\n");
    }
    printf("\n");
}
bool converge(double *xk, double *xkp, int n)
{
    double norm = 0;
    for (int i = 0; i < n; i++)
    {
        norm += (xk[i] - xkp[i])*(xk[i] - xkp[i]);
    }
    if (sqrt(norm) >= eps)
        return false;
    return true;
}
void iteration(double **a, double *b, double *x, int n)
{
 double p[n];
 for(int i=0; i<n; i++)
      x[i]=0;
do
{
    for (int i = 0; i < n; i++)
        p[i] = x[i];

    for (int i = 0; i < n; i++)
    {
        double var = 0.;
        for (int j = 0; j < i; j++)
            var += (a[i][j] * x[j]);
        for (int j = i + 1; j < n; j++)
            var += (a[i][j] * p[j]);
        x[i] = (b[i] - var) / a[i][i];
    }
}
while (!converge(x, p, n));
}

int main()
{
 int n;
    printf("Enter the size of matrix and vector\n");
    scanf("%d",&n);

    double **a=new double *[n];
    for(int i=0; i<=n-1; i++)
    {
        a[i]=new double [n];
    }

    double *b=new double [n];
    double *x=new double [n];

    InputFileMatr(a, n);
    InputFileVect(b, n);
    OutputDescMatrix(a, n);
    OutputDescVect(b, n);
    iteration(a, b, x, n);
    OutputDescVect(x, n);

    for(int j=0; j<=n-1; j++)
    {
        delete [] a[j];
    }
    delete [] a; a=NULL;
    delete [] b; b=NULL;
    delete [] x; x=NULL;
 return 0;
}
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 04.12.2017 в 15:50.
Nadya13 вне форума Ответить с цитированием
Старый 04.12.2017, 16:02   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Это потому что у Вас converge всегда истинна. А истинна, потому что else забыли:

Код:
    
if (sqrt(norm) >= eps){
  return false;
}
else {
  return true;
}
а вообще - можно написать так и не заморачиваться:

Код:
return (sqrt(norm) >= eps);
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 04.12.2017, 16:33   #3
gantzboss
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Это потому что у Вас converge всегда истинна. А истинна, потому что else забыли
Разве при return он не выходит, то есть если >= то он бы вышел и вернул false не идя дальше. Также там цикл while отрицательный если было бы тру он бы не циклился

Последний раз редактировалось gantzboss; 04.12.2017 в 16:57. Причина: не верное утверждение
gantzboss вне форума Ответить с цитированием
Старый 04.12.2017, 17:20   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от gantzboss Посмотреть сообщение
Разве при return он не выходит, то есть если >= то он бы вышел и вернул false не идя дальше. Также там цикл while отрицательный если было бы тру он бы не циклился
Ай чёрт, Ваша правда . Старею, наверное, азбуку забывать начал
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение СЛАУ методом Крамера (C++) Meror Помощь студентам 11 03.10.2016 16:46
Решение СЛАУ методом GMRES(С++) Radgalf Помощь студентам 1 25.02.2014 14:38
решение СЛАУ методом гаусса al172 Помощь студентам 0 12.11.2013 17:08
Решение СЛАУ методом Гаусса и методом Крамера. R1k1 Помощь студентам 0 24.03.2012 19:17