ModestGenius

Task №4

Sep 30th, 2015
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.66 KB | None | 0 0
  1. #include "iostream"
  2. #include "math.h"
  3.  
  4. using namespace std;
  5. double **directFlow (double **mtrx, double *vector, int n, int *&otv)
  6. {
  7.     double **M=new double *[n];
  8.     for(int i=0;i<n;i++)
  9.         M[i]=new double [n+1];
  10.     for (int i=0;i<n;i++)
  11.         for (int j=0;j<n;j++)
  12.             M[i][j]=mtrx[i][j];
  13.     for (int i=0;i<n;i++)
  14.         M[i][n]=vector[i];
  15. //____________________________________//
  16.  
  17.  
  18.  
  19.     int i_max, j_max;
  20.     double ax;
  21.     for(int k=0;k<n+1;k++)
  22.     {
  23.         i_max = k, j_max = k;
  24.         for (int i = k; i < n; i++ )
  25.             for (int j = k; j < n; j++ )
  26.                 if ( fabs( M[i_max] [j_max] ) < fabs( M[i] [j] ) )
  27.                 {
  28.                     i_max = i;
  29.                     j_max = j;
  30.                 }
  31.   //Переставляем строки
  32.                 for (int j = k; j < n+1 && k<n; j++ )
  33.                 {
  34.                     ax = M[k][j];
  35.                     M[k] [j] = M[i_max] [j];
  36.                     M[i_max] [j] = ax;
  37.                 }
  38.   //Переставляем столбцы
  39.                 for ( int i = 0; i < n; i++ )
  40.                 {
  41.                     ax = M[i] [k];
  42.     M[i] [k] = M[i] [j_max];
  43.     M[i] [j_max] = ax;
  44.   }
  45.   //Учитываем изменение порядка корней
  46.   int m = otv[k];
  47.   otv[k] = otv[j_max];
  48.   otv[j_max] = m;
  49.  
  50.         for (int i=1;i+k<n;i++)
  51.         {
  52.             ax=M[i+k][k]/M[k][k];
  53.             for(int j=0;j+k<n+1;j++)
  54.             {
  55.                 M[i+k][k+j]-=ax*M[k][k+j];
  56.             }
  57.         }
  58.     }
  59. //____________________________________//
  60.  
  61.  
  62.         return M;
  63. }
  64.  
  65.  
  66.  
  67. double *reverseFlow(double **mtrx, int n, int *&otv)
  68. {
  69.     double **M=new double *[n];
  70.     for(int i=0;i<n;i++)
  71.         M[i]=new double [n+1];
  72.     for (int i=0;i<n;i++)
  73.         for (int j=0;j<n+1;j++)
  74.             M[i][j]=mtrx[i][j];
  75.     double c;
  76.     for(int i=0;i<n;i++)
  77.     {
  78.         c=M[i][i];
  79.         for (int j=i;j<n+1;j++)
  80.         {
  81.             M[i][j]/=c;
  82.         }
  83.     }
  84.         double *x=new double [n];
  85.         for(int i=0;i<n;i++)
  86.         {
  87.                 x[i]=0;
  88.         }
  89.         x[n-1]=M[n-1][n];
  90.         for(int i=n-2;i>=0;i--)
  91.         {
  92.             x[i]=M[i][n];
  93.             for( int j=1;j+i<n;j++)
  94.                 x[i]-=x[i+j]*M[i][i+j];
  95.         }
  96.  
  97.  
  98.         return x;
  99. }
  100.  
  101. double *check (double **mtrx, int n,  double *x)
  102. {
  103.     double **M=new double *[n];
  104.         for(int i=0;i<n;i++)
  105.             M[i]=new double [n];
  106.         for (int i=0;i<n;i++)
  107.             for (int j=0;j<n;j++)
  108.                 M[i][j]=mtrx[i][j];
  109.         double *X=new double [n];
  110.             for(int i=0;i<n;i++)
  111.                 for (int j=0;j<n;j++)
  112.                     X[j]=x[j];
  113.         double *B=new double [n];
  114.             for(int i=0;i<n;i++)
  115.                 for(int j=0;j<n;j++)
  116.                     B[i]+=M[i][j]*X[j];
  117.             return B;
  118.  
  119. }
  120.  
  121. int main()
  122. {
  123.     double det=1, c;
  124.     int n;
  125.     cout<<"n="<<endl;
  126.     cin>>n;
  127.     double **a=new double *[n];
  128.     for(int i=0;i<n;i++)
  129.         a[i]=new double [n];
  130.     for (int i=0;i<n;i++)
  131.         for (int j=0;j<n;j++)
  132.         {
  133.             cout<<"a["<<i<<"]["<<j<<"]=";
  134.             cin>>a[i][j];
  135.         }
  136.         double *b=new double [n];
  137.         for (int i=0;i<n;i++)
  138.         {
  139.             cout<<"b["<<i<<"]=";
  140.             cin>>b[i];
  141.         }
  142.  
  143.         int *otv=new int [n];
  144.         for ( int i = 0; i < n ; i++ )
  145.         otv[i] = i;
  146.  
  147.         directFlow(a,b,n, otv);
  148.         for(int i=0;i<n;i++)
  149.             det*=directFlow(a,b,n, otv)[i][i];
  150.         cout<<"det="<<det<<endl;
  151.         double *x=new double [n];
  152.                 for (int i=0;i<n;i++)
  153.                 {
  154.                     x[i]=reverseFlow(directFlow(a,b,n, otv), n, otv)[i];
  155.                 }
  156.  
  157.          for(int i=0;i<n-1;i++)
  158.                 for(int j=n-1;j>i;j--)
  159.                     if(otv[j]<otv[j-1])
  160.                                                 {
  161.                                                         c=otv[j];
  162.                                                         otv[j]=otv[j-1];
  163.                                                         otv[j-1]=c;
  164.                                                         c=x[j];
  165.                                                         x[j]=x[j-1];
  166.                                                         x[j-1]=c;
  167.  
  168.                                                 }
  169.     for ( int j = 0; j < n; j++ )
  170.         cout<<"x["<<j<<"]="<<x[j]<<endl;
  171.  
  172.  
  173.     for(int i=0;i<n;i++)
  174.     cout<<check(a,n,x)[i]<<endl;
  175.         return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment