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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2011, 01:19   #1
Pecho
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 37
По умолчанию Метод Гаусса (обратная матрица). Си

Доброго времени суток, уважаемые форумчане!

Большая просьба, проверьте код на правильность
Это метод Гаусса, для нахождения обратной матрицы
Проверка не сходится

Код:
#include <stdio.h>

int main(int argc, char** argv)
{
	int i,j,k;
	int Ai[5][5]={{0,1,0,1,0},{1,0,0,0,0},{1,1,1,0,1},{1,1,0,1,1},{1,1,0,0,0}};
		//==========СОСТАВЛЕНИЕ РАБОЧЕЙ МАТРИЦЫ А========
	
	//размерность матрицы
	int n=5;
	//рабочая матрица
	int A[5][10];
	//копируем исходную в рабочую
	for (i=0; i<n; i++)
		for (j=0; j<n; j++)
			A[i][j]=Ai[i][j];
	//прибавляем единичную матрицу
	for (i=0; i<n; i++)
		for (j=n; j<2*n; j++)
		{
			if (i+n==j)
				A[i][j]=1;
			else
				A[i][j]=0;
		}

	//==========МЕТОД ГАУССА ДЛЯ МАТРИЦЫ В=========	
	
	for (i=0; i<n; i++)
	{
		if (A[i][i]==0)
			for (j=i+1; j<n; j++)
			{
				if (A[j][i]==1)
				{
					for (k=0; k<2*n; k++)
					{
						int c=A[j][k];
						A[j][k]=A[i][k];
						A[i][k]=c;
					}
					break;
				}
			}
		for (k=i+1; k<n; k++)
		{
			if (A[k][i]==1)
			{
				for (j=0; j<2*n; j++)
				{
					A[k][j]^=A[i][j];
				}
			}
		}
	}
		for (i=n-1; i>=0; i--)
		{
			for (k=i-1; k>=0; k--)
			{
				if (A[k][i]==1)
				{
					for (j=0; j<2*n; j++)
					A[k][j]^=A[i][j];
				}
			}
		}	
		
	//обратная матрица
	int B[5][5];
	
	//копируем в обратную матрицу В
	for (i=0; i<n; i++)
		for (j=0, k=n; j<n; j++, k++)
			B[i][j]=A[i][k];
	//Выводим на экран обратную матрицу
	for (i=0; i<n; i++){
		for (j=0; j<n; j++)
			printf("%i",B[i][j]);
		printf("\n");}
//Проверка. А*В=Е
int E[5][5];
for (i=0; i<n; i++){
	for (j=0; j<n; j++)
				E[i][j]=0;
	}
	
	for (i=0; i<n; i++){
		for (j=0; j<n; j++){
			for (k=0; k<n; k++)
				E[i][j]^=A[i][k] & B[k][j];
		}
	}
	//Выводим на экран единичную матрицу
	printf("\n");
	for (i=0; i<n; i++){
		for (j=0; j<n; j++)
			printf("%i",E[i][j]);
		printf("\n");}
	return 0;
}
Pecho вне форума Ответить с цитированием
Старый 01.09.2011, 01:55   #2
Pecho
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 37
По умолчанию

В строчке E[i][j]^=A[i][k] & B[k][j]; которая в разделе "проверка" в конце кода надо не A писать, а Ai
Разобрался
Глупая ошибка
Pecho вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обратная матрица LastBreath Помощь студентам 1 04.06.2010 20:30
Обратная матрица Шахрия Помощь студентам 1 26.10.2009 17:28
Обратная матрица Nox_uf Помощь студентам 1 23.09.2009 16:11
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. Хомяк!!!!! Помощь студентам 4 08.07.2009 10:08