Facebook
From Subtle Mockingbird, 6 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 284
  1. #include<iomanip>
  2. #include<cmath>
  3. #include<iostream>
  4.  
  5. using namespace std;
  6.  
  7. struct newElement {
  8.         double k;
  9.         double c;
  10.         double l;
  11.         double s;
  12.         double H[2][2];
  13.         double P[2];
  14. };
  15.  
  16. const double eps = 1e-12;
  17.  
  18. void print(double **tab, int length) {
  19.         for (int i = 0; i < length; i++) {
  20.                 for (int j = 0; j < length; j++) {
  21.                         cout << tab[i][j] << "\t";
  22.                 }
  23.                 cout << endl;
  24.         }
  25. }
  26.  
  27. void printVec(double *tab, int length) {
  28.         for (int i = 0; i < length; i++) {
  29.                 cout << tab[i] << "\t";
  30.                 cout << endl;
  31.         }
  32. }
  33.  
  34. bool gauss(int n, double **AB, double *X)
  35. {
  36.         int j, k, i;
  37.         double m, s;
  38.  
  39.         for (i = 0; i < n - 1; i++)
  40.         {
  41.                 for (j = i + 1; j < n; j++)
  42.                 {
  43.                         if (fabs(AB[i][i]) < eps) return false;
  44.                         m = -AB[j][i] / AB[i][i];
  45.                         for (k = i + 1; k <= n; k++)
  46.                                 AB[j][k] += m * AB[i][k];
  47.                 }
  48.         }
  49.  
  50.         for (i = n - 1; i >= 0; i--)
  51.         {
  52.                 s = AB[i][n];
  53.                 for (j = n - 1; j >= i + 1; j--)
  54.                         s -= AB[i][j] * X[j];
  55.                 if (fabs(AB[i][i]) < eps) return false;
  56.                 X[i] = s / AB[i][i];
  57.         }
  58.         return true;
  59. }
  60.  
  61. int main()
  62. {
  63.         int me = 2;
  64.         newElement *element = new newElement[me];
  65.         double **HG = new double *[me + 1];
  66.  
  67.         for (int j = 0; j <= me; j++) {
  68.                 HG[j] = new double[me + 2];
  69.         }
  70.  
  71.         double *PG = new double[me + 1];
  72.         double k = 50;
  73.         double l = 2.5;
  74.         double s = 2;
  75.         double t = 400;
  76.         double q = -150;
  77.         double alfa = 10;
  78.  
  79.         for (int i = 0; i <= me; i++) {
  80.                 for (int j = 0; j <= me; j++) {
  81.                         HG[i][j] = 0;
  82.                 }
  83.         }
  84.  
  85.         for (int j = 0; j <= me; j++) {
  86.  
  87.                 PG[j] = 0;
  88.         }
  89.         for (int i = 0; i < me; i++) {
  90.                 element[i].k = k;
  91.                 element[i].s = s;
  92.                 element[i].l = l;
  93.                 element[i].c = element[i].k * element[i].s / element[i].l;
  94.                 element[i].P[0] = 0;
  95.                 element[i].P[1] = 0;
  96.                 element[i].H[0][0] = element[i].c;
  97.                 element[i].H[0][1] = -(element[i].c);
  98.                 element[i].H[1][0] = -(element[i].c);
  99.                 element[i].H[1][1] = element[i].c;
  100.         }
  101.  
  102.         element[me - 1].H[1][1] += alfa*s;
  103.         element[0].P[0] -= q*s;
  104.         element[me - 1].P[1] += alfa * s * t;
  105.  
  106.         for (int i = 0; i < me; i++) {
  107.                 HG[i][i] += element[i].H[0][0];
  108.                 HG[i][i + 1] += element[i].H[0][1];
  109.                 HG[i + 1][i] += element[i].H[1][0];
  110.                 HG[i + 1][i + 1] += element[i].H[1][1];
  111.                 PG[i] += element[i].P[0];
  112.                 PG[i + 1] += element[i].P[1];
  113.         }
  114.  
  115.         for (int i = 0; i <= me; i++) {
  116.                 HG[i][me + 1] = PG[i];
  117.         }
  118.  
  119.         print(HG, me + 1);
  120.         cout << endl;
  121.         cout << endl;
  122.  
  123.         printVec(PG, me + 1);
  124.         double *X = new double[me + 1];
  125.         gauss(me + 1, HG, X);
  126.  
  127.         cout << endl;
  128.         cout << endl;
  129.         printVec(X, me + 1);
  130.         system("pause");
  131.         return 0;
  132. }