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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2010, 22:47   #1
True_girl
Пользователь
 
Регистрация: 29.11.2008
Сообщений: 28
По умолчанию Как исправить ошибку?

Помогите пожалуйста! Есть код, который решает СЛАУ методом Зейделя, проблема в том что, при вводе в матрицу отрицательных значений, результат выдается странный, кто может объяснить почему?
Код:
#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();
}
True_girl вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal (Работа с файлами) как исправить ошибку Natsu Помощь студентам 9 28.02.2010 20:24
как исправить ошибку? aiktz Паскаль, Turbo Pascal, PascalABC.NET 3 24.09.2009 18:56
Как исправить ошибку типа: 16-разрядная подсистема MS-DOS Mclaren Помощь студентам 10 28.04.2009 20:07
При переключении между чекбоксами - ошибка Stack overflow. Как исправить эту ошибку? SkAndrew Общие вопросы Delphi 5 26.08.2008 21:32
MySQL как исправить ошибку Dengar PHP 8 03.03.2008 03:29