Форум программистов, компьютерный форум CyberForum.ru

Метод Гаусса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 91, средняя оценка - 4.99
Гамбит
13 / 13 / 1
Регистрация: 19.10.2009
Сообщений: 93
14.11.2010, 20:03     Метод Гаусса #1
Всем доброго времени суток. Нужно написать программу для решения СЛАУ методом Гаусса.
Код
#include <stdio.h>
#include <stdlib.h>
#define n 4
void check(float mass[n][n],float sc[n], int i)
{
int j,t=0;
for (j=0;j<n;j++)
if (mass[i][j]!=0)
t=1;
if(t==0&&sc[i]==0){
printf("множество решений");
exit(0);}
if(t==0&&sc[i]!=0){
printf("система не совместна**");
exit(0);}
}
void check1(float mass[n][n],float sc[n],int i)
{
int j,k;
float b;
for (j=i+1;j<n-1;j++)
if (mass[j][i]!=0)
	{
	for (k=i;k<n;k++)
		{
		b=mass[i][k];
		mass[i][k]=mass[j][k];
		mass[j][k]=b;
		}
	b=sc[i];
	sc[i]=sc[j];
	sc[j]=b;
	return;
	}
}
void main()
{
float mass[n][n],sc[n],x[n];
float h=0;
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
	{
	printf("ввод матрицы:",i,j);
	scanf("%f",&mass[i][j]);
	}
for(i=0;i<n;i++)
	{
	printf("‚столбец свободных членов:",i);
	scanf("%f",&sc[i]);
	}
for(i=0;i<n;i++)
	{
	if(mass[i][i]==0)
	check1(mass,sc,i);
	for(j=i+1;j<n;j++)
		{
		h=mass[j][i]/mass[i][i];
		sc[j]=sc[j]-h*sc[i];
		for (k=i;k<n;k++)
		mass[j][k]=mass[j][k]-h*mass[i][k];
		h=0;
		}
	check(mass,sc,i);
	}
x[n-1]=sc[n-1]/mass[n-1][n-1];
for(i=n-2;i>=0;i--)
	{
	for(j=n-1;j>i;j--)
	sc[i]=sc[i]-mass[i][j]*x[j];
	x[i]=sc[i]/mass[i][i];
	}
for(i=0;i<n;i++)
printf("%2.1f\n",x[i]);
}
так вот. системы без перестановок (если не используется функция check1) она решает.типо
3 1 -1 -2
1 5 -1 8
2 0 3 1
но вот систему с перестановкой
0 1 0 -2 1
3 0 -3 2 1
2 -1 2 0 1
-5 0 1 0 1
которая должна быть не совместной, программа каким то образом вычисляет. что не так то?

Добавлено через 50 минут
ну помогите плиииз. я никак не могу понять где ошибка. если в check1 убрать return, то программа пишет что система не совместна. Но это будет ошибкой!

Добавлено через 1 час 24 минуты
Код
#include <stdio.h>
#include <stdlib.h>
#define n 4
void check(float mass[n][n],float sc[n],int i)
{
int j,t=0;
for (i;i<n;i++)
	{
	for (j=0;j<n;j++)
	if (mass[i][j]!=0)
	t=1;
	if(t==0&&sc[i]==0){
	printf("бЁб⥬* Ё¬ҐҐв ЎҐбзЁб«Ґ**®Ґ ¬*®¦Ґбвў® аҐиҐ*Ё©");
	exit(0);}
	if(t==0&&sc[i]!=0){
	printf("бЁб⥬* *Ґб®ў¬Ґбв**");
	exit(0);}t=0;
	}
}
void check1(float mass[n][n],float sc[n],int i)
{
int j,k;
float b;
for (j=i+1;j<n-1;j++)
if (mass[j][i]!=0)
	{
	for (k=i;k<n;k++)
		{
		b=mass[i][k];
		mass[i][k]=mass[j][k];
		mass[j][k]=b;
		}
	b=sc[i];
	sc[i]=sc[j];
	sc[j]=b;
	return;
	}
}
void main()
{
float mass[n][n],sc[n],x[n];
float h=0;
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
	{
	printf("‚ўҐ¤ЁвҐ н«Ґ¬Ґ*в A[%d,%d] :",i,j);
	scanf("%f",&mass[i][j]);
	}
for(i=0;i<n;i++)
	{
	printf("‚ўҐ¤ЁвҐ %d-н«Ґ¬Ґ*в бв®«Ўж* бў®Ў®¤*ле з«Ґ*®ў:",i);
	scanf("%f",&sc[i]);
	}
for(i=0;i<n;i++)
	{
	if(mass[i][i]==0)
	check1(mass,sc,i);
	for(j=i+1;j<n;j++)
		{
		h=mass[j][i]/mass[i][i];
		sc[j]=sc[j]-h*sc[i];
		for (k=i;k<n;k++)
		mass[j][k]=mass[j][k]-h*mass[i][k];
		h=0;
		}
	check(mass,sc,i);
	}
printf("\n");
for(i=1;i<=n;i++)
{
printf("|");
for(j=1;j<=n;j++)
{
printf("%2.1f ",mass[i][j]);
}
printf("|");
printf("%2.1f",sc[i]);
printf("\n");
}

x[n-1]=sc[n-1]/mass[n-1][n-1];
for(i=n-2;i>=0;i--)
	{
	for(j=n-1;j>i;j--)
	sc[i]=sc[i]-mass[i][j]*x[j];
	x[i]=sc[i]/mass[i][i];
	}
for(i=0;i<n;i++)
printf("%2.1f\n",x[i]);
}
Немного исправил, добавил вывод конечной матрицы и изменил кое что в проверке на совместность, но даже при этом, при выводе матрицы с 0 0 0 0 3 оно мне находит корни уравнения. как????? провернка должна завершать программу, а она не завершает=(

Добавлено через 53 минуты
Код
void check(float mass[n][n],float sc[n],int i)
{
int j,t=0;
for (i;i<n;i++)
	{
	for (j=0;j<n;j++)
	if (fabs(mass[i][j]<0.01))
	t=1;
	if(t==0&&sc[i]==0){
	printf("бЁб⥬* Ё¬ҐҐв ЎҐбзЁб«Ґ**®Ґ ¬*®¦Ґбвў® аҐиҐ*Ё©");
	exit(0);}
	if(t==0&&sc[i]!=0){
	printf("бЁб⥬* *Ґб®ў¬Ґбв**");
	exit(0);}t=0;
	}
}
новые изменения в коде. Вспомнив что в типе float 0 обычно никак не получишь, я изменил условие идентификатора, но оно все равно не работает=( подскажите плиз-почему!!!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2010, 20:03     Метод Гаусса
Посмотрите здесь:

Метод Гаусса!!! C++
Метод Гаусса в С++ C++
метод Гаусса C++
C++ метод гаусса
метод Гаусса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.11.2010, 20:08     Метод Гаусса #2
Цитата Сообщение от Гамбит Посмотреть сообщение
Нужно написать программу для решения СЛАУ методом Гаусса
Методов Гаусса здесь вагон и маленькая тележка) Воспользуйтесь поиском, может найдете уже готовый код.
Гамбит
13 / 13 / 1
Регистрация: 19.10.2009
Сообщений: 93
14.11.2010, 20:10  [ТС]     Метод Гаусса #3
УРА товарищи!!!! Вот работающая программа:dance3:. приятно осознавать, что написал её сам. Извините за беспокойство
Код
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define n 4
void check(float mass[n][n],float sc[n])
{
int j,i,t=0;
for (i=0;i<n;i++)
	{
	for (j=0;j<n;j++)
	if (fabs(mass[i][j]>0.00001))
	t=1;
	if(t==0&&sc[i]==0){
	printf("бЁб⥬* Ё¬ҐҐв ЎҐбзЁб«Ґ**®Ґ ¬*®¦Ґбвў® аҐиҐ*Ё©");
	exit(0);}
	if(t==0&&sc[i]!=0){
	printf("бЁб⥬* *Ґб®ў¬Ґбв**");
	exit(0);}t=0;
	}
}
void check1(float mass[n][n],float sc[n],int i)
{
int j,k;
int b;
for (j=i+1;j<n;j++)
if (mass[j][i]!=0)
	{
	for (k=i;k<n;k++)
		{
		b=mass[i][k];
		mass[i][k]=mass[j][k];
		mass[j][k]=b;
		}
	b=sc[i];
	sc[i]=sc[j];
	sc[j]=b;
	return;
	}
}
void main()
{
float mass[n][n],sc[n],x[n];
float h=0;
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
	{
	printf("‚ўҐ¤ЁвҐ н«Ґ¬Ґ*в A[%d,%d] :",i,j);
	scanf("%f",&mass[i][j]);
	}
for(i=0;i<n;i++)
	{
	printf("‚ўҐ¤ЁвҐ %d-н«Ґ¬Ґ*в бв®«Ўж* бў®Ў®¤*ле з«Ґ*®ў:",i);
	scanf("%f",&sc[i]);
	}
for(i=0;i<n;i++)
	{
	if(mass[i][i]==0)
	check1(mass,sc,i);
	for(j=i+1;j<n;j++)
		{
		h=mass[j][i]/mass[i][i];
		sc[j]=sc[j]-h*sc[i];
		for (k=i;k<n;k++)
		mass[j][k]=mass[j][k]-h*mass[i][k];

		}    check(mass,sc);
	}
printf("\n");
for(i=0;i<n;i++)
{
printf("|");
for(j=0;j<n;j++)
{
printf("%f ",mass[i][j]);
}
printf("|");
printf("%f",sc[i]);
printf("\n");
}

x[n-1]=sc[n-1]/mass[n-1][n-1];
for(i=n-2;i>=0;i--)
	{
	for(j=n-1;j>i;j--)
	sc[i]=sc[i]-mass[i][j]*x[j];
	x[i]=sc[i]/mass[i][i];
	}
for(i=0;i<n;i++)
printf("%f\n",x[i]);
}
Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
Методов Гаусса здесь вагон и маленькая тележка) Воспользуйтесь поиском, может найдете уже готовый код.
вагонов нам не надо, своё нужнее. Все таки прогером мне быть. Нельзяж всю жизнь с форумов таскать проги=)
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.11.2010, 20:15     Метод Гаусса #4
Цитата Сообщение от Гамбит Посмотреть сообщение
вагонов нам не надо, своё нужнее. Все таки прогером мне быть. Нельзяж всю жизнь с форумов таскать проги=)
Правильно, просто большинство сюда обращаются за готовыми программами, вот я и посоветовал сначала поискать
Гамбит
13 / 13 / 1
Регистрация: 19.10.2009
Сообщений: 93
14.11.2010, 21:34  [ТС]     Метод Гаусса #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
Правильно, просто большинство сюда обращаются за готовыми программами, вот я и посоветовал сначала поискать
я раньше тоже пытался за готовыми программами обращался=) но на 2 курсе появилось что-то типо проф. гордости=))) а выложил прогу. потому что она почти правильная, оставалось только несколько штрихов. и она меня порядком достала.
geek
 Аватар для geek
24 / 24 / 3
Регистрация: 21.10.2009
Сообщений: 509
12.03.2011, 13:22     Метод Гаусса #6
Можешь объяснить мне этот код?
Гамбит
13 / 13 / 1
Регистрация: 19.10.2009
Сообщений: 93
13.03.2011, 22:12  [ТС]     Метод Гаусса #7
Цитата Сообщение от geek Посмотреть сообщение
Можешь объяснить мне этот код?
не уверен=) но можно попробывать. что не понятно?
manbI4
0 / 0 / 0
Регистрация: 29.11.2010
Сообщений: 14
07.04.2011, 17:21     Метод Гаусса #8
Как я понял Она Счетает погрешность, меняет местами элементы и умножает на вектор!?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2014, 21:44     Метод Гаусса
Еще ссылки по теме:

Метод Гаусса C++
Метод Гаусса C++
Метод Гаусса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dimka4351
1 / 1 / 0
Регистрация: 08.10.2013
Сообщений: 22
14.01.2014, 21:44     Метод Гаусса #9
Гамбит, Здравствуйте! Не могли бы Вы пояснить, что делает функция check?
Yandex
Объявления
14.01.2014, 21:44     Метод Гаусса
Ответ Создать тему
Опции темы

Текущее время: 20:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru