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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2012, 18:15   #1
Dmitry_Web
Пользователь
 
Аватар для Dmitry_Web
 
Регистрация: 01.11.2011
Сообщений: 43
По умолчанию СЛАУ методом квадратного корня C++

Код:
#include <iostream.h>
#include <math.h>
#include <iomanip.h>

const int n = 5;
const int d = - 5;
const double q = -2.58;

int sign ( double );
double sum ( int, double[ 5 ][ 5 ], double[ 5 ][ 5 ] );
double sum ( int, int, double[ 5 ][ 5 ], double[ 5 ][ 5 ] );
double sum ( int, double[ 5 ][ 5 ], double[ 5 ], double[ 5 ][ 5 ] );
double sum ( int, double [ 5 ][ 5 ], double[ 5 ]);

void main()
{
	double a[ 5 ][ 5 ] = { { q, 1, 0, 0, 0 }, { 1, -2, 1, 0, 0 }, { 0, 1, -2, 1, 0 }, { 0, 0, 1, -2, 1 }, { 0, 0, 0, 1, q } };
	double b[ 5 ] = { 0, d, d, d, 0 };
	double s[ 5 ][ 5 ] = { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } };
	double s_t[ 5 ][ 5 ];
	double d[ 5 ][ 5 ] = { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } };
	double x[ 5 ];
	double y[ 5 ];
	int i, j, k;

	d[ 0 ][ 0 ] = sign ( a[ 0 ][ 0 ] );
	s[ 0 ][ 0 ] = sqrt ( fabs ( a[ 0 ][ 0 ] ) );
	for ( k = 0; k < n; k++ )
	{
		if ( k != 0 ) 
		{
			d[ k ][ k ] = sign ( a[ k ][ k ] - sum ( k, d, s ) );
			s[ k ][ k ] = sqrt ( fabs ( a[ k ][ k ] - sum ( k, d, s ) ) );
			cout << "s ["<< k <<"]["<< k <<"] " << s[ k ][ k ] << endl;
		}
		for ( j = k + 1; j < n; j++ )
		{
			s[ k ][ j ] = ( a[ k ][ j ] - sum ( k, j, d, s ) ) / ( s[ k ][ k ] * d[ k ][ k ] );
			cout << "s ["<< k <<"]["<< j <<"] " << s[ k ][ j ] << endl;
		}
	}
	cout << '\n';
	for ( i = 0; i < n; i++ )
	{
		for ( j = 0; j < n; j++ )
		{
			cout << s[ i ][ j ] << setw(15);
		}
		cout << '\n';
	}
	for ( i = 0; i < n; i++ )
	{
		for ( j = 0; j < n; j++ )
		{
			s_t[ i ][ j ] = s[ j ][ i ];
		}
	}
	cout << "\n\n\n";
	for ( i = 0; i < n; i++)
	{
		for ( j = 0; j < n; j++ )
		{
			cout << s_t[ i ][ j ] << setw(15);
		}
		cout << '\n';
	}
	y[ 0 ] = b[ 0 ] / ( s[ 0 ][ 0 ] * d[ 0 ][ 0 ] );
	for ( i = 0; i < n; i++ )
		y[ i ] = ( b[ i ] - sum ( i, d, y, s ) ) / ( s[ i ][ i ] * d[ i ][ i ] );
	for ( i = 0; i < n; i++ )
		cout << y[ i ] << endl;
	x[ n ] = y[ n ] / s[ n ][ n ];
	cout << "\n\n\n";
	for ( i = n; i >= 0; i-- )
		x[ i ] = ( y[ i ] - sum ( i, s, x ) ) / s[ i ][ i ];
	for ( i = 0; i < n; i++ )
		cout << x[ i ] << endl;
}

double sum ( int k, double d[ 5 ][ 5 ], double s[ 5 ][ 5 ] )
{
	int i; 
	double sum = 0;

	for ( i = 0; i <= k - 2; i++ )
		sum += d[ i ][ i ] * pow( s[ i ][ k ], 2 );

	return sum;
}

double sum ( int k, int j, double d[ 5 ][ 5 ], double s[ 5 ][ 5 ] )
{
	double sum = 0;

	for ( int i = 0; i <= k - 2; i++ )
	{
		sum += d[ i ][ i ] * s[ i ][ k ] * s[ i ][ j ];
	}

	return sum;
}

double sum ( int i, double d[ 5 ][ 5 ], double y[ 5 ], double s[ 5 ][ 5 ] )
{
	double sum = 0;

	for ( int k = 0; k <= i - 2; k++ )
		sum += d[ k ][ k ] * y[ k ] * s[ k ][ i ];

	return sum;
}

double sum ( int i, double s[ 5 ][ 5 ], double x[ 5 ] )
{
	double sum = 0;

	for ( int k = i + 1; k <= n - 1; k++ )
		sum += s[ i ][ k ] * x[ k ];

	return sum;
}

int sign ( double z )
{
	if ( z > 0)
		return 1;
	else 
		return - 1;
}
Может подскажите, то не так?
Dmitry_Web вне форума Ответить с цитированием
Старый 02.03.2012, 19:21   #2
AlexDark
Форумчанин
 
Аватар для AlexDark
 
Регистрация: 23.12.2011
Сообщений: 117
По умолчанию

Хм хз что было не так, модуль телепатии устал...
Но в общем :

Код:
#include <iostream> // без .h 
#include <math.h>
#include <iomanip> // без .h

using namespace std; // для cin cout (да это зло таскать ВСЕ пространство имен std) )

const int n = 5;
const int d = - 5;
const double q = -2.58;

int sign ( double );
double sum ( int, double[ 5 ][ 5 ], double[ 5 ][ 5 ] );
double sum ( int, int, double[ 5 ][ 5 ], double[ 5 ][ 5 ] );
double sum ( int, double[ 5 ][ 5 ], double[ 5 ], double[ 5 ][ 5 ] );
double sum ( int, double [ 5 ][ 5 ], double[ 5 ]);

void main()
{
	double a[ 5 ][ 5 ] = { { q, 1, 0, 0, 0 }, { 1, -2, 1, 0, 0 }, { 0, 1, -2, 1, 0 }, { 0, 0, 1, -2, 1 }, { 0, 0, 0, 1, q } };
	double b[ 5 ] = { 0, d, d, d, 0 };
	double s[ 5 ][ 5 ] = { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } };
	double s_t[ 5 ][ 5 ];
	double d[ 5 ][ 5 ] = { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } };
	double x[ 5 ];
	double y[ 5 ];
	int i, j, k;

	d[ 0 ][ 0 ] = sign ( a[ 0 ][ 0 ] );
	s[ 0 ][ 0 ] = sqrt ( fabs ( a[ 0 ][ 0 ] ) );
	for ( k = 0; k < n; k++ )
	{
		if ( k != 0 ) 
		{
			d[ k ][ k ] = sign ( a[ k ][ k ] - sum ( k, d, s ) );
			s[ k ][ k ] = sqrt ( fabs ( a[ k ][ k ] - sum ( k, d, s ) ) );
			cout << "s ["<< k <<"]["<< k <<"] " << s[ k ][ k ] << endl;
		}
		for ( j = k + 1; j < n; j++ )
		{
			s[ k ][ j ] = ( a[ k ][ j ] - sum ( k, j, d, s ) ) / ( s[ k ][ k ] * d[ k ][ k ] );
			cout << "s ["<< k <<"]["<< j <<"] " << s[ k ][ j ] << endl;
		}
	}
	cout << '\n';
	for ( i = 0; i < n; i++ )
	{
		for ( j = 0; j < n; j++ )
		{
			cout << s[ i ][ j ] << setw(15);
		}
		cout << '\n';
	}
	for ( i = 0; i < n; i++ )
	{
		for ( j = 0; j < n; j++ )
		{
			s_t[ i ][ j ] = s[ j ][ i ];
		}
	}
	cout << "\n\n\n";
	for ( i = 0; i < n; i++)
	{
		for ( j = 0; j < n; j++ )
		{
			cout << s_t[ i ][ j ] << setw(15);
		}
		cout << '\n';
	}
	y[ 0 ] = b[ 0 ] / ( s[ 0 ][ 0 ] * d[ 0 ][ 0 ] );
	for ( i = 0; i < n; i++ )
		y[ i ] = ( b[ i ] - sum ( i, d, y, s ) ) / ( s[ i ][ i ] * d[ i ][ i ] );
	for ( i = 0; i < n; i++ )
		cout << y[ i ] << endl;
	//x[ n] = y[ n ] / s[ n ][ n ]; Выходы за пределе всего что тут... и вообще смысл в это строке?
	cout << "\n\n\n";
	for ( i = n-1; i >= 0; i-- ) // n-1 ! n - выход за пределы массива
		x[ i ] = ( y[ i ] - sum ( i, s, x ) ) / s[ i ][ i ];
	for ( i = 0; i < n; i++ )
		cout << x[ i ] << endl;
	cin.get();
}

double sum ( int k, double d[ 5 ][ 5 ], double s[ 5 ][ 5 ] )
{
	int i; 
	double sum = 0;

	for ( i = 0; i <= k - 2; i++ )
		sum += d[ i ][ i ] * pow( s[ i ][ k ], 2 );

	return sum;
}

double sum ( int k, int j, double d[ 5 ][ 5 ], double s[ 5 ][ 5 ] )
{
	double sum = 0;

	for ( int i = 0; i <= k - 2; i++ )
	{
		sum += d[ i ][ i ] * s[ i ][ k ] * s[ i ][ j ];
	}

	return sum;
}

double sum ( int i, double d[ 5 ][ 5 ], double y[ 5 ], double s[ 5 ][ 5 ] )
{
	double sum = 0;

	for ( int k = 0; k <= i - 2; k++ )
		sum += d[ k ][ k ] * y[ k ] * s[ k ][ i ];

	return sum;
}

double sum ( int i, double s[ 5 ][ 5 ], double x[ 5 ] )
{
	double sum = 0;

	for ( int k = i + 1; k <= n - 1; k++ )
		sum += s[ i ][ k ] * x[ k ];

	return sum;
}

int sign ( double z )
{
	if ( z > 0)
		return 1;
	else 
		return - 1;
}
AlexDark вне форума Ответить с цитированием
Старый 02.03.2012, 19:57   #3
Dmitry_Web
Пользователь
 
Аватар для Dmitry_Web
 
Регистрация: 01.11.2011
Сообщений: 43
По умолчанию

Ну ответы одни и те же получаются, просто взял проверил ответы с онлайн - решениями
:
x1 = Δ1/Δ ≈ 4.05
x2 = Δ2/Δ ≈ 11.55
x3 = Δ3/Δ ≈ 14.05
x4 = Δ4/Δ ≈ 11.55
x5 = Δ5/Δ ≈ 4.05
Там правда через другой метод, но всё же.
А у нас:
Снимок.JPG
Цитата:
#include <iostream> // без .h
#include <math.h>
#include <iomanip> // без .h
Как в универе учат, так и пишу.
Цитата:
//x[ n] = y[ n ] / s[ n ][ n ]; Выходы за пределе всего что тут... и вообще смысл в это строке?
Вычисляем 5-ое значение x, т.к. для вычисления предыдущих x нужна сумма.
Dmitry_Web вне форума Ответить с цитированием
Старый 02.03.2012, 19:59   #4
Dmitry_Web
Пользователь
 
Аватар для Dmitry_Web
 
Регистрация: 01.11.2011
Сообщений: 43
По умолчанию

Спасибо за n - 1, не заметил.
Всё получилось!

Последний раз редактировалось Dmitry_Web; 02.03.2012 в 21:18.
Dmitry_Web вне форума Ответить с цитированием
Старый 27.05.2012, 21:20   #5
Snou
Новичок
Джуниор
 
Регистрация: 27.05.2012
Сообщений: 1
По умолчанию

Цитата:
Сообщение от Dmitry_Web Посмотреть сообщение
Спасибо за n - 1, не заметил.
Всё получилось!
так те ответы,что вы писали, правильны?
можешь кинуть весь рпавильный код пожалуйсто?

Последний раз редактировалось Snou; 27.05.2012 в 21:29.
Snou вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод квадратного корня kitty_girl Помощь студентам 2 04.11.2011 14:17
решение слу методом квадратного корня dmitrialenitchev Общие вопросы C/C++ 1 03.10.2011 00:08
Вычисление квадратного корня Wera Visual C++ 7 09.07.2010 19:23
Метод квадратного корня RrR007 Помощь студентам 0 10.06.2009 21:01