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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2015, 16:19   #1
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
Восклицание Метод Гаусса

Добрый день!

Помогите, пожалуйста, программа неправильно решает СЛАУ.

2X1-1X2+0X3=3
0X1+5X2+2X3=7
1X1-1X2+3X3=4

Правильный ответ:
X1=2
X2=1
X3=1

Ответ, который выдает программа:
X1=2
X2=1
X3=0

Код:
#include <iostream>
using namespace std;
void sysout(double **a, double *y, int n) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++){
			cout << a[i][j] << "*x" << j;
			if (j < n - 1) {
				cout << " + ";
			}
		}
		cout << " = " << y[i] << endl;
	}
	return;
}
int * gauss(double **a, double *y, int n) {
	double max;
	int *x, k, index;
	const double eps = 0.00001;
	x = new int[n];
	k = 0;
	while (k < n) {

		max = abs(a[k][k]);
		index = k;
		for (int i = k + 1; i < n; i++) {
			if (abs(a[i][k]) > max) {
				max = a[i][k];
				index = i;
			}
		}

		if (max < eps) {

			cout << "Решение получить невозможно из-за нулевого столбца ";
			cout << index << "матрицы A" << endl;
			return 0;
		}
		for (int j = 0; j < n; j++) {
			double temp = a[k][j];
			a[k][j] = a[index][j];
			a[index][j] = temp;
			temp = y[k];
			y[k] = y[index];
			y[index] = temp;
		}

		for (int i = k; i < n; i++) {
			double temp = a[i][k];
			if (temp < eps) continue;
			for (int j = 0; j < n; j++) {
				a[i][j] = a[i][j] / temp;
			}
			y[i] = y[i] / temp;
			if (i == k)  continue;
			for (int j = 0; j < n; j++) {
				a[i][j] = a[i][j] - a[k][j];
			}
			y[i] = y[i] - y[k];
		}
		k++;
	}

	for (k = n - 1; k >= 0; k--) {
		x[k] = y[k];
		for (int i = 0; i < k; i++) {
			y[i] = y[i] - a[i][k] * x[k];
		}
	}
	return x;
}
int main() {
	double **a, *y;
	int *x, n, g;
	system("chcp 1251");
	system("cls");
	cout << "Введите количество уравнений: ";
	cin >> n;
	a = new double*[n];
	y = new double[n];
	for (int i = 0; i < n; i++) {
		a[i] = new double[n];
		for (int j = 0; j < n; j++) {
			cout << "a[" << i << "][" << j << "]= ";
			cin >> a[i][j];
		}
	}
	for (int i = 0; i < n; i++) {
		cout << "y[" << i << "]= ";
		cin >> y[i];
	}
	sysout(a, y, n);
	x = gauss(a, y, n);
	for (int i = 0; i < n; i++){
		cout << "x[" << i << "]=" << x[i] << endl;
	}
	cin.get(); cin.get();
	return 0;
}
Maray вне форума Ответить с цитированием
Старый 18.10.2015, 17:22   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

чот уж больно наворочено...
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 18.10.2015, 17:45   #3
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

Подскажите, а в моей программе никак не исправить? Если нет, то нет ли у вас кода к блок-схеме?
Maray вне форума Ответить с цитированием
Старый 18.10.2015, 17:50   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
а в моей программе никак не исправить?
Думаешь, что найдётся извращенец, который будет копаться в твоём говнокоде?
Цитата:
нет ли у вас кода к блок-схеме?
Конечно есть. Вот он.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 18.10.2015, 17:58   #5
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Думаешь, что найдётся извращенец, который будет копаться в твоём говнокоде?
Можно было и нормально сказать. Я ещё только изучаю С++. Не надо так называть мою программу, я её все выходные писала. Я же просто спросила
Maray вне форума Ответить с цитированием
Старый 18.10.2015, 18:01   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Можно было и нормально сказать. Я ещё только изучаю С++. Не надо так называть мою программу, я её все выходные писала. Я же просто спросила
Добро пожаловать ва реальный мир. Тут живые люди, а не роботы.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 18.10.2015, 23:45   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Во-первых, double *x;
Во-вторых, программа неверная. То что она выдаёт 2 правильных корня чистая случайность. На любых других тестах она удачно валится. Достаточно добавить в процедуру double * gauss(double **a, double *y, int n) после k++; строку sysout(a, y, n); Там видно, что в 3-ем уравнении второй член не зануляется
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод гаусса. ironhide8 Помощь студентам 4 30.05.2014 06:33
Метод Гаусса на C#. bestnicer Помощь студентам 0 27.11.2012 14:54
метод простых операций и метод гаусса зейделя tarasman11 Паскаль, Turbo Pascal, PascalABC.NET 1 23.09.2012 14:46
метод Гаусса aank10 Общие вопросы C/C++ 0 22.06.2011 16:25
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. Хомяк!!!!! Помощь студентам 4 08.07.2009 10:08