Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


Решение системы линецных уравнений методом обратной матрицы

Код: Выделить весь код
#include <stdio.h>
#include <windows.h>
#include <time.h>

#define XYZZ 4

void print_matrix(double **m, int sz);
void print_vector(double *m, int sz);
void random_matrix(double **m, int sz);
void random_vector(double *m, int sz);
double opredelitel(double **m, int sz);
void obratnaya_matrix(double **m, double **newm, double mainopr, int sz);
int poww(int,int);
void change_lines(double **m, int sz, int d,int t);
void copy_matrix(double **m, double **newm, int sz);
void copy_matrix(double **m, double **newm, int sz, int d, int i);
void multiplicate_matrix_and_vector(double **m, double *line, double *result, double mainopr,int sz);

void main()
{
	double mainopr;
	int size=XYZZ;
	double* line;
	double* result;
	double** matrix;
	
	matrix = new double*[size];	

	for(int k=0;k<size;k++)
	{
		matrix[k]=new double[size];		
		}

	line = new double[size];
	result = new double[size];
	
	/* Проскуряков #567*/
	/*matrix[0][0]=3;matrix[0][1]=-2;matrix[0][2]=-5;matrix[0][3]=1;
	matrix[1][0]=2;matrix[1][1]=-3;matrix[1][2]=1;matrix[1][3]=5;	
	matrix[2][0]=1;matrix[2][1]=2;matrix[2][2]=0;matrix[2][3]=-4;
	matrix[3][0]=1;matrix[3][1]=-1;matrix[3][2]=-4;matrix[3][3]=9;
	line[0]=3; line[1]=-3; line[2]=-3;line[3]=22;/**/
	matrix[0][0]=4;matrix[0][1]=-3;matrix[0][2]=1;matrix[0][3]=5;
	matrix[1][0]=1;matrix[1][1]=-2;matrix[1][2]=-2;matrix[1][3]=-3;	
	matrix[2][0]=3;matrix[2][1]=-1;matrix[2][2]=2;matrix[2][3]=0;
	matrix[3][0]=2;matrix[3][1]=3;matrix[3][2]=2;matrix[3][3]=-8;
	line[0]=7; line[1]=3; line[2]=-1;line[3]=-7;

	//random_matrix(matrix,size);
	printf("Matrix:\n");
	print_matrix(matrix,size);
	//random_vector(line,size);
	printf("Vector:\n");
	print_vector(line,size);	

	mainopr=opredelitel(matrix,size);
	printf("Main determinant: %f\n",mainopr);

	if (mainopr !=0)
	{
		printf("Reshenie metodom obratn matricy: \n");
		multiplicate_matrix_and_vector(matrix, line,result, mainopr, size);
	}
	else
	{
		printf("Matritsa ne imeet obratnoy. Metod neprimenim\n");
	}

	for(k=0;k<size;k++)
	{
		delete[] matrix[k];			
	}

	delete[] matrix;
	delete[] line;
	delete[] result;
}



void print_matrix(double **m, int sz)
{
int i,j;

for (i=0 ; i<sz; i++)
	{
		for (j=0; j<sz;j++)
		{
			printf("%f ", m[i][j]);
		}
		printf("\n");
	}

}

void print_vector(double *m, int sz)
{
int i;

for (i=0 ; i<sz; i++)
	printf("%f ", m[i]);
printf("\n");

}



void random_matrix(double **m, int sz)
{
int i,j;
srand (time(NULL));

for (i=0 ; i<sz; i++)	
	for (j=0; j<sz;j++)		
		m[i][j]=rand()%10;

}

void random_vector(double *m, int sz)
{
int i;
srand (time(NULL));

for (i=0 ; i<sz; i++)	
		m[i]=rand()%10;

}


void copy_matrix(double **m, double **newm, int sz)
{
	int i,j;
	for (i=0 ; i<sz; i++)	
		for (j=0; j<sz;j++)		
			newm[i][j]=m[i][j];

}
void copy_matrix(double **m, double **newm, int sz, int d, int i)
{
	int k,l,newmi,newmj;

	newmi=0;
	newmj=0;

	for (k=0 ; k<sz; k++) 
		{
		if (k != d)
			{
				for (l=0; l<sz;l++)
				{
					if (l!=i)
					{
						newm[newmi][newmj]=m[k][l];
						newmj++;
					}
				}
				newmi++;
				newmj=0;						
			}
		}
}


double opredelitel(double **m, int sz)
{
	double x,result;
	int i,j,k,l,n, num_of_changes;
	double** matrix_copy;

	matrix_copy = new double*[sz];
	for(k=0;k<sz;k++)
		matrix_copy[k]=new double[sz];
	copy_matrix(m,matrix_copy,sz);
	
	result = 1;
	num_of_changes=0;

	if ( sz > 2)
		{
			for(i=0,j=0;i<sz-1;i++,j++)
				{
					if (matrix_copy[i][j]==0)
						{						
							for(k=i+1;k<sz;k++)
							{
								if(matrix_copy[k][j]!=0)
								{
									change_lines(matrix_copy,sz,i,k);
									num_of_changes++;
									break;
								}
							}
						}
					for(l=i+1;l<sz;l++)
						{							
								if (matrix_copy[l][j] != 0)
									{
										x=-matrix_copy[l][j]/matrix_copy[i][j];
										for (n=j;n<sz;n++)
										{
											matrix_copy[l][n]=matrix_copy[i][n]*x+matrix_copy[l][n];
										}
									}
						}
				}
		}
	else if (sz==2)
		{
		return (m[0][0]*m[1][1]-m[0][1]*m[1][0]);
		}
	else if (sz==1)
		{
		return (m[0][0]);
		}			
	else 
		{
		printf ("Error");
		return (-1);
		}

	for(i=0,j=0;i<sz;i++,j++)
	{
		result *= matrix_copy[i][j] ;
	}
	result *= poww(-1,num_of_changes);

	for(k=0;k<sz;k++)
		delete[] matrix_copy[k];	
	delete[] matrix_copy;

	return(result);	
}

void change_lines(double **m, int sz, int d,int t)
{
	int i;
	double temp;
	for (i=0;i< sz;i++)
	{
		temp=m[d][i];
		m[d][i]=m[t][i];
		m[t][i]=temp;
	}
}


int poww(int d,int t){
	int st=1;
	int result=1;

	for(st=1; st<=t; st++)
	{
		result*=d;
	}
	return (result);

}



void obratnaya_matrix(double **m, double **newm, double mainopr, int sz)
{	
	/*
	Алгоритм
	1. находим алгебраической дополнение
	2. делим алг. дополнение на определитель
	3. заносим в новую матрицу
	*/

	double** data;
	int size, i,j,k,reali,realj,correction;
	double opr, obr_element;

	size = sz - 1;//Размер алгебраического дополнения


	for (i=0;i<sz;i++)
	{
		for( j=0;j<sz;j++)
		{
			//алгебраическое дополнение
			data = new double*[size]; 

			for(k=0;k<size;k++)
			{
				data[k]=new double[size];
			}
			// Находим алгебраическое дополнение
			// Вычеркиваемая строка  i,j
			copy_matrix(m, data,sz,i,j);

			//Находим определитель алгебраического дополнения
			opr=opredelitel(data,size);	

			reali=i+1;
			realj=j+1;
			
			correction = poww(-1,reali+realj);

			//Уничтожаем алгебраическое дополнение
			for(k=0;k<size;k++)
				{
					delete[] data[k];
				}
			delete[] data;

			//Находим обратный элемент
			obr_element = (opr*correction)/mainopr;

			//Заносим в обратную матрицу
			newm[j][i]=obr_element;
		}
	}
}


void multiplicate_matrix_and_vector(double **m, double *line, double *result, double mainopr,int sz)
{
	int i,j;
	double x;
	double** newmatrix;
	newmatrix = new double*[sz];

	for(int k=0;k<sz;k++)
		{
		newmatrix[k]=new double[sz];
		}


	if (mainopr !=0)
	{
		obratnaya_matrix(m, newmatrix, mainopr, sz);
		printf("Obratnaya matritsa: \n");
		print_matrix(newmatrix,sz);

		for (i=0;i<sz;i++)
		{
			x=0;
			for (j=0; j<sz;j++)
			{				
				x += newmatrix[i][j]*line[j];
							}
			result[i]=x;
			printf("result[%d]=%f\n",i,result[i]);			
		}
	}
	else
	{
		printf("Error\n");
	}

	for(k=0;k<sz;k++)
	{		
		delete[] newmatrix[k];
	}

	delete[] newmatrix;

}

-------
Ehhh.. what's up, doc?..

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:58, 03-07-2008 | #8