Имя пользователя:
Пароль:
 

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

Ветеран


Сообщения: 1405
Благодарности: 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 change_lines(double **m, int sz, int d,int t);
int poww(int,int);
void copy_matrix(double **m, double **newm, int sz);
void change_column_matrix(double **m, double **newm, double *line, int num_column, int sz);
void kramer(double **m, double *line, double mainopr,int sz);

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

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

	line = 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;/**/
	/* Проскуряков #568*/
	/*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: \n");
		kramer(matrix, line,mainopr, size);
	}
	else
	{
		printf("Systema nekramerovskaya\n");
	}

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

	delete[] matrix;
	delete[] line;	
}


void kramer(double **m, double *line, double mainopr,int sz)
{
	int i;
	double** newmatrix;
	double x;

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

	for(i=0; i<sz;i++)
	{
		change_column_matrix(m, newmatrix, line, i, sz);
		x=opredelitel(newmatrix,sz)/mainopr;
		printf("x[%d]=%f\n",i,x);
	}

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

	delete[] newmatrix;

}

void change_column_matrix(double **m, double **newm, double *line, int num_column, int sz)
{

	int i,j;

	if (num_column <sz){
		for (i=0 ; i<sz; i++)
		{	
			for (j=0; j<sz;j++)	
			{	
				if (j != num_column)
				{
					newm[i][j]=m[i][j];
				}
				else
				{
					newm[i][j]=line[i];
				}

			}
		}
	}
	else
	{
		printf("Error\n");
	}

}

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];

}


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);

}

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


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