Код:
#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;
}