Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "iostream"
- #include "math.h"
- using namespace std;
- double **directFlow (double **mtrx, double *vector, int n, int *&otv)
- {
- double **M=new double *[n];
- for(int i=0;i<n;i++)
- M[i]=new double [n+1];
- for (int i=0;i<n;i++)
- for (int j=0;j<n;j++)
- M[i][j]=mtrx[i][j];
- for (int i=0;i<n;i++)
- M[i][n]=vector[i];
- //____________________________________//
- int i_max, j_max;
- double ax;
- for(int k=0;k<n+1;k++)
- {
- i_max = k, j_max = k;
- for (int i = k; i < n; i++ )
- for (int j = k; j < n; j++ )
- if ( fabs( M[i_max] [j_max] ) < fabs( M[i] [j] ) )
- {
- i_max = i;
- j_max = j;
- }
- //Переставляем строки
- for (int j = k; j < n+1 && k<n; j++ )
- {
- ax = M[k][j];
- M[k] [j] = M[i_max] [j];
- M[i_max] [j] = ax;
- }
- //Переставляем столбцы
- for ( int i = 0; i < n; i++ )
- {
- ax = M[i] [k];
- M[i] [k] = M[i] [j_max];
- M[i] [j_max] = ax;
- }
- //Учитываем изменение порядка корней
- int m = otv[k];
- otv[k] = otv[j_max];
- otv[j_max] = m;
- for (int i=1;i+k<n;i++)
- {
- ax=M[i+k][k]/M[k][k];
- for(int j=0;j+k<n+1;j++)
- {
- M[i+k][k+j]-=ax*M[k][k+j];
- }
- }
- }
- //____________________________________//
- return M;
- }
- double *reverseFlow(double **mtrx, int n, int *&otv)
- {
- double **M=new double *[n];
- for(int i=0;i<n;i++)
- M[i]=new double [n+1];
- for (int i=0;i<n;i++)
- for (int j=0;j<n+1;j++)
- M[i][j]=mtrx[i][j];
- double c;
- for(int i=0;i<n;i++)
- {
- c=M[i][i];
- for (int j=i;j<n+1;j++)
- {
- M[i][j]/=c;
- }
- }
- double *x=new double [n];
- for(int i=0;i<n;i++)
- {
- x[i]=0;
- }
- x[n-1]=M[n-1][n];
- for(int i=n-2;i>=0;i--)
- {
- x[i]=M[i][n];
- for( int j=1;j+i<n;j++)
- x[i]-=x[i+j]*M[i][i+j];
- }
- return x;
- }
- double *check (double **mtrx, int n, double *x)
- {
- double **M=new double *[n];
- for(int i=0;i<n;i++)
- M[i]=new double [n];
- for (int i=0;i<n;i++)
- for (int j=0;j<n;j++)
- M[i][j]=mtrx[i][j];
- double *X=new double [n];
- for(int i=0;i<n;i++)
- for (int j=0;j<n;j++)
- X[j]=x[j];
- double *B=new double [n];
- for(int i=0;i<n;i++)
- for(int j=0;j<n;j++)
- B[i]+=M[i][j]*X[j];
- return B;
- }
- int main()
- {
- double det=1, c;
- int n;
- cout<<"n="<<endl;
- cin>>n;
- double **a=new double *[n];
- for(int i=0;i<n;i++)
- a[i]=new double [n];
- for (int i=0;i<n;i++)
- for (int j=0;j<n;j++)
- {
- cout<<"a["<<i<<"]["<<j<<"]=";
- cin>>a[i][j];
- }
- double *b=new double [n];
- for (int i=0;i<n;i++)
- {
- cout<<"b["<<i<<"]=";
- cin>>b[i];
- }
- int *otv=new int [n];
- for ( int i = 0; i < n ; i++ )
- otv[i] = i;
- directFlow(a,b,n, otv);
- for(int i=0;i<n;i++)
- det*=directFlow(a,b,n, otv)[i][i];
- cout<<"det="<<det<<endl;
- double *x=new double [n];
- for (int i=0;i<n;i++)
- {
- x[i]=reverseFlow(directFlow(a,b,n, otv), n, otv)[i];
- }
- for(int i=0;i<n-1;i++)
- for(int j=n-1;j>i;j--)
- if(otv[j]<otv[j-1])
- {
- c=otv[j];
- otv[j]=otv[j-1];
- otv[j-1]=c;
- c=x[j];
- x[j]=x[j-1];
- x[j-1]=c;
- }
- for ( int j = 0; j < n; j++ )
- cout<<"x["<<j<<"]="<<x[j]<<endl;
- for(int i=0;i<n;i++)
- cout<<check(a,n,x)[i]<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment