Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться 
:(
    Опции темы
Grizzzli
Дата 19.4.2010, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



Ребята,  есть такая проблема, есть код который решает сис-му уравнений методом Зейделя, но при вводе отрицательных значений выдается какой-то странный результат, скажите. что не так?

Код

#include <stdio.h>
#include <math.h>

#define N    3
#define M    300

double A[N][N]={{4,1,-5},{3,4,2},{1,5,5}};
double B[N]={11,1,-10};

double X[N],S;
float Tolerance;
int i,j;

bool Seidel(void)
{
    double Y[N];
    int i,j,l;
    double copy;
    bool Tolerance_stop_flag;
    int k=0;
    bool Iteration_stop_flag=false;

    for(i=0;i<N;i++)
    {
        Y[i]=0;X[i]=0;
    }
    do
    {
        k++;
        for(i=0;i<N;i++)
        {
            if(!A[i][i])
            {
                l=i;
                do
                {
                    l++;
                    if((!A[l][i])&&(l==N-1))
                    {
                        printf("Ошибка приведения системы для %d-го уравнения\n",i);
                        return false;
                    }
                }while(!A[l][i]);
                copy=B[i];
                B[i]=B[l];
                B[l]=copy;
                for(j=0;j<N;j++)
                {
                    copy=A[i][j];
                    A[i][j]=A[l][j];
                    A[l][j]=copy;
                }
                printf("%d-ое и %d-ое ур-ия системы переставлены\n",i,l);
            }
            S=0;
            for(j=0;j<N;j++)if(j!=i)S+=A[i][j]*X[j];
            X[i]=(B[i]-S)/A[i][i];
        }
        i=0;
        Tolerance_stop_flag=false;
        do
        {
            if(fabs(X[i]-Y[i])>Tolerance)
                Tolerance_stop_flag=true;
            else i++;
        }while(!((i==N-1)||(Tolerance_stop_flag)));
        if(!Tolerance_stop_flag)
        {
            Iteration_stop_flag=true;
            printf("Число итераций: %d\n",k);
        }else 
            for(i=0;i<N;i++)Y[i]=X[i];
    }while(!((k==M)||(Iteration_stop_flag)));
    if(!Iteration_stop_flag)
        printf("Достигнуто заданное число итераций! %d\n",M);
    return true;
}

void main (void)
{
    printf("Метод Зейделя\n");
    printf("A                B\n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)printf("%d  ",(int)A[i][j]);
        printf("            %d\n",(int)B[i]);
    }
    do{
        printf("Допустимая точность решения? ");
        scanf("%f",&Tolerance);
    }while(!((Tolerance>0)&&(Tolerance<1)));
    if(Seidel())
    {
        printf("Вектор решения X        Вектор невязок B-AX\n");
        for(i=0;i<N;i++)
        {
            S=0;
            for(j=0;j<N;j++)S+=A[i][j]*X[j];
            printf("%f            %f\n",X[i],(B[i]-S));
        }
    }
    getchar();getchar();
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0382 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.