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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2014, 05:35   #1
Максим Опанасенко
Новичок
Джуниор
 
Регистрация: 07.03.2014
Сообщений: 1
Печаль Программа по методу Зейделя не всегда работает правильно (Visual C++)

Уважаемые форумчане, пишу программу для решения СЛАУ методом Зейделя. Столкнулся с такой проблемой: программа решает не все системы.
Пример:

Матрица коэффициентов:
1 1 1
2 3 1
1 -1 -1

Столбец свободных членов:
4
9
-2

Корни:
1
2
1

Методом Гаусса-Жордана данная СЛАУ решается хорошо. Не могу определить в чем проблема. Сразу прошу прощения за корявый русский, так как я его не изучал. Если у вас будут общие пожелания для усовершенствования программы - буду рад их узнать) Учится ведь никогда не поздно)

Ниже приведён мой код


Код:
#include<iostream>
using namespace std;
#include<malloc.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>

class CSlar{
	double **A;//матрица коэффициентов
	double *B;
	double *X;
	int n;
	int i,j,k;
public:
	CSlar(int N);
	CSlar();
	void Input();
	void Print();
	double *Zeidel();
	int Get_n(){return n;};
	~CSlar();
};

int main(){
	CSlar object(3);
	object.Print ();
	int n=object.Get_n();
	double *X=new double [n];
	X=object.Zeidel();
	for(int i=0;i<n;i++)
		printf("\n%lf",X[i]);
	printf("\n");
	getch();
	return 0;
}

CSlar::CSlar(){
	printf("Vvedite razmer matricy N=");
	scanf("%d",&n);

	A = new double*[n];
	for(int i=0; i<n; i++)
		A[i]= new double [n];
	B=new double[n];
	X=new double[n];
	Input();
}

CSlar::CSlar(int N){
	n=N;
	A = new double*[n];
	for(int i=0; i<n; i++)
		A[i]= new double[n];
	B=new double[n];
	X=new double[n];

	Input();
}

CSlar::~CSlar(){
	for(int i=0;i<n;i++)
		delete[] A[i];
	delete[] A;
	delete B;
	delete X;
}
void CSlar::Print(){
	//Коэффициенты:
	printf("\n Coefficienty\n");
	for(i=0;i<n;i++){
		for(j=0;j<n;j++)
			printf("%lf\t",A[i][j]);
		printf("\n\n");
	}
	//Свободный столбец:
	printf("\n Svobodniy stolbec\n");
	for(i=0;i<n;i++)
		printf("\n%lf",B[i]);
	printf("\n");
}

void CSlar::Input(){
	//Введите маcсив коэффициентов
	printf("Vvedite coeficienty:\n");
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			printf("A[%d][%d] = ",i,j);
			scanf("%lf",&A[i][j]);
		}
	}
	printf("Vvedite svobodniy stolbec\n");
	for(i=0;i<n;i++){
		printf("B[%d]=",i);
		scanf("%lf",&B[i]);
	}
}


double *CSlar::Zeidel()
{


	#define eps 0.000001 //требуемая точность вычислений

 double norma; // норма вектора
 double* xn,*x;
 xn = (double*)calloc(n,sizeof(double));
  x = (double*)calloc(n,sizeof(double));
    cout<<"Введите стартовый вектор:"<<endl;
            for(i=0;i<n;i++)
            {   
                cout<<"  x ["<<"|"<<i+1<<"|"<<"] = ";
                cin>>x[i];
            }
 
	 for(i=0;i<10;i++)
            {
            xn[i]=0;
            X[i]=x[i];
            }
            do
            {  k++;
               norma=0;
               for(i=0;i<n;i++)
               {
                  X[i]=-B[i];
                  for(j=0;j<n;j++)
                  {
                      if(i!=j)
                          X[i]+=A[i][j]*X[j];
                  }
                  X[i]/=-A[i][i];
               }
               for(i=0;i<n;i++)
               {
                  if(fabs(X[i]-xn[i]) > norma)
                      norma=fabs(X[i]-xn[i]);
                  xn[i]=X[i];
               }
             }
             while(norma > eps);

	return X;
}

Последний раз редактировалось Максим Опанасенко; 08.03.2014 в 05:52.
Максим Опанасенко вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на Visual C# работает при запуске руками, но не работает при попытки автоматического запуска Bug$ Помощь студентам 18 21.10.2013 16:22
Монитор работает не всегда flance Компьютерное железо 8 05.07.2013 18:23
C++ Программа не всегда работает правильно. PROkaZZZniK Помощь студентам 1 03.04.2013 17:48
Не всегда корректно работает RewriteRule Anubys PHP 1 08.01.2013 20:14
Пояснение по методу Зейделя. Tonik_A Помощь студентам 0 27.12.2009 13:54