Gistrec

МКЭ

Dec 12th, 2018
284
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. class finite_elements {
  8. private:
  9.     vector<double> A; // Диагональ слева
  10.     vector<double> B; // Диагональ справа
  11.     vector<double> C; // Главная диагональ
  12.     vector<double> F; // Вектор правой части
  13.  
  14.     int n;  // Количество элементов
  15.     int n1; // Количество узлов
  16.  
  17. public:
  18.     finite_elements(int m) {
  19.         n = m;
  20.         n1 = m + 1;
  21.         A = B = C = F = vector<double>(n1, 0);
  22.  
  23.         filling();
  24.         progonka();
  25.     }
  26.  
  27.     void progonka() {
  28.         vector<double> X(n1);
  29.         vector<double> alpha(n1 + 1, 0);
  30.         vector<double> beta(n1 + 1, 0);
  31.         alpha[1] = -B[0] / C[0];
  32.         beta[1] = F[0] / C[0];
  33.         for (int i = 1; i < (A.size() - 1); i++) {
  34.             alpha[i + 1] = -B[i] / (A[i] * alpha[i] + C[i]);
  35.             beta[i + 1] = (F[i] - A[i] * beta[i]) / (A[i] * alpha[i] + C[i]);
  36.         }
  37.         int n = A.size() - 1;
  38.         X[n] = (F[n] - A[n] * beta[n]) / (C[n] + A[n] * alpha[n]);
  39.         for (int i = (A.size() - 1); i > 0; i--)
  40.             X[i - 1] = alpha[i] * X[i] + beta[i];
  41.  
  42.         for (int i = 0; i <= n; i++)
  43.             cout << X[i] << endl;
  44.         system("pause");
  45.     }
  46.  
  47.     double get_k(double x) {
  48.         if ((x > 0.3) && (x < 0.6))
  49.             return 0.001;
  50.         else return 1;
  51.         //return 1;
  52.     }
  53.  
  54.     /**
  55.      * Значение функции в точке X
  56.      */
  57.     double func(double x) {
  58.         return 0;
  59.     }
  60.  
  61.     double inc_integral(double left, double right) {
  62.         double sum = 0;
  63.         double h = (right - left) / 100.f;
  64.         double x = left - 0.5*h;
  65.         for (int i = 0; i < 100; i++) {
  66.             x += h; // значение х
  67.             sum += (func(x) * n * x) * h;
  68.         }
  69.         return sum;
  70.     }
  71.  
  72.     double dec_integral(double left, double right) {
  73.         double sum = 0;
  74.         double h = (right - left) / 100.f;
  75.         double x = left - 0.5*h;
  76.         for (int i = 0; i < 100; i++) {
  77.             x += h; // значение х
  78.             sum += (func(x) * n * (right - x)) * h;
  79.         }
  80.         return sum;
  81.     }
  82.  
  83.     void filling() {
  84.         for (int i = 0; i < n; i++) {
  85.             F[i]     += dec_integral((double)i / n, (double)(i + 1) / n);
  86.             F[i + 1] += inc_integral((double)i / n, (double)(i + 1) / n);
  87.         }
  88.         for (int i = 0; i < n; i++) {
  89.             C[i] += n * get_k((i + 0.5) / n);
  90.             B[i] = -1 * n * get_k((i + 0.5) / n);
  91.             A[i + 1] = -1 * n * get_k((i + 0.5) / n);
  92.             C[i + 1] += n * get_k((i + 0.5) / n);
  93.         }
  94.         C[0] = 1;
  95.         B[0] = 0;
  96.         F[0] = 20;
  97.         A[n] = 0;
  98.         C[n] = 1;
  99.         F[n] = 50;
  100.     }
  101. };
  102.  
  103. int main() {
  104.     finite_elements A(10);
  105.     return 0;
  106. }
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment