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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2009, 11:31   #1
XeN0N
Форумчанин
 
Аватар для XeN0N
 
Регистрация: 18.01.2009
Сообщений: 118
По умолчанию Решение СЛАУ (метод простых итераций)

Код:
//---------------------------------------------------------------------------

#include <conio.h>
#include <fstream.h>
#include <iostream.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
	clrscr();
	ifstream in;
	int n,i,j,k;
	in.open("in.txt");
/* Файл in.txt
n - размер матрицы
a[1][1] a[1][2] a[1][3]... a[n][n] b[n] c[n]
...
...
k - количество итераций

c - точное решение (для проверки погрешности)
*/
	in >>n;
	// G - диагональ матрицы А
	// H - матрица А без диагонали
	// X = D*X + F
	// F = B * 1/g
	// D = -H * 1/g
	double **a = new double*[n]; // коэффициенты
	double **h = new double*[n];
	double **D = new double*[n];
	double *b = new double[n];
	double *c = new double[n];
	double *x = new double[n]; // ответ
	double *xt = new double[n]; // временные иксы
	double *g = new double[n];
	double *F = new double[n];
	for (i=0; i < n; i++) {
		a[i] = new double[n];
		h[i] = new double[n];
		D[i] = new double[n];
		for (j=0; j<n; j++) {
			in >>a[i][j];
			h[i][j] = (i==j)? 0 : -a[i][j]; // для D = -H *...
		}
		in >>b[i]>>c[i];
	}
	for (i=0; i < n; i++) {
		x[i] = b[i]/a[i][i]; // начальное приближение икса - свободные члены разделить на диагональ
		g[i] = 1/a[i][i];
		F[i] = g[i]*b[i];
	}

	for (i=0; i <n; i++) {
		for (j=0; j < n; j++) {
			D[i][j] = (i==j)? 0 : g[i]*h[i][j];
		}
	}
	double summ;
	int p;
	for (p = 0; p < k; p++) {
		for (i = 0; i < n; i++) {
			summ = 0;
			for (j = 0; j < n; j++){ // DX = сумма всей строки Д * на текущий икс
				summ +=D[i][j];
			}
			//cout <<"xt[i] = "<<summ<<"*"<<x[i]<<"+"<<F[i]<<endl;
			xt[i] = summ * xt[i] + F[i]; //X = DX + F
			cout <<xt[i]<<" ";
		}
		cout <<endl;
		x = xt; // присваивание иксу следующего приближения
	}
	getch();
	return 0;
}
//---------------------------------------------------------------------------
Не могу найти ошибку. Вот что выводит ( в конце ):
Код:
2.05405 2.22277 2.10256 3.17272
2.05405 2.22326 2.10256 3.17273
2.05405 2.2228 2.10256 3.17272
2.05405 2.22323 2.10256 3.17273
2.05405 2.22283 2.10256 3.17273
2.05405 2.2232 2.10256 3.17273

Последний раз редактировалось XeN0N; 12.02.2009 в 11:34.
XeN0N вне форума Ответить с цитированием
Старый 12.02.2009, 23:07   #2
XeN0N
Форумчанин
 
Аватар для XeN0N
 
Регистрация: 18.01.2009
Сообщений: 118
По умолчанию

ап .
XeN0N вне форума Ответить с цитированием
Старый 15.02.2009, 21:33   #3
XeN0N
Форумчанин
 
Аватар для XeN0N
 
Регистрация: 18.01.2009
Сообщений: 118
По умолчанию

ап .
XeN0N вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод простых итераций в Delphi Tomoyo Помощь студентам 21 26.12.2009 19:11
как решить нелинейное уравнение методом простых итераций??? Bonifaciy Помощь студентам 3 13.11.2008 17:30
текст программы для решения нелинейного уравнения методом простых итераций Dyst Помощь студентам 2 14.05.2008 22:00
Уравнение метода итераций SPQR Помощь студентам 2 12.11.2007 01:26