Advertisement
vadimk772336

Untitled

Feb 17th, 2020
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include <cmath>
  4. #include <vector>
  5. #include <Windows.h>
  6. #include <stdlib.h>
  7. #include <fstream>
  8. #include <string.h>
  9. #include <time.h>
  10. #include <iomanip>
  11. using namespace std;
  12.  
  13. /* Рандом даёт ток целое число, поэтому отказались от этого
  14.     int flag = 0;
  15.     double r,h;
  16.  
  17.     h = (Array[CountSegments + 1].x - Array[0].x) / CountSegments;
  18.     if (CountSegments % 2 == 0)
  19.         flag = 1;
  20.  
  21.     if (flag == 1) {
  22.         for (int i = 1; i < CountSegments + 1; i=i+2) {
  23.             r = (rand() % h + 1);
  24.             Array[i].x = h + r;
  25.             Array[i].y = (*f)(Array[i].x);
  26.             Array[i + 1].x = h - r;
  27.             Array[i + 1].y = (*f)(Array[i + 1].x);
  28.         }
  29.     }
  30.     else {
  31.         Array[1].x = Array[0].x+h;
  32.         Array[1].y = (*f)(Array[1].x);
  33.         for (int i = 2; i < CountSegments; i=i+2) {
  34.             r = (rand() % 3 + 1);
  35.             Array[i].x = h+r;
  36.             Array[i].y = (*f)(Array[i].x);
  37.             Array[i+1].x = h-r;
  38.             Array[i+1].y = (*f)(Array[i+1].x);
  39.         }
  40.  
  41.     }
  42.    
  43. */
  44.  
  45. typedef double(*functiontype)(double x);
  46. typedef struct Node
  47. {
  48.     double x, y;
  49. } Node;
  50. typedef double(*method)(double x, Node* Array, int Count, double* DD_massiv);
  51. typedef struct Interval
  52. {
  53.     double InitialNode, EndNode;
  54. } Interval;
  55. const double PI = 3.141592653589793238463;
  56. double Myfunc(double x)
  57. {
  58.     return x;
  59. }
  60. functiontype Func = &Myfunc;
  61.  
  62. //Равномерная сетка
  63. void ValueUniformTable(functiontype* f, Node* Array, double Initial, double End, int CountSegments)
  64. {
  65.     int i;
  66.     double alpha, h;
  67.  
  68.     Array[0].x = Initial;
  69.     Array[CountSegments].x = End;
  70.     Array[0].y = (*f)(Array[0].x);
  71.     Array[CountSegments].y = (*f)(Array[CountSegments].x);
  72.  
  73.     h = (Array[CountSegments].x - Array[0].x) / CountSegments;
  74.  
  75.     cout << "(" << Array[0].x << ":" << Array[0].y << ")" << endl;
  76.     for (int i = 1; i < CountSegments; i++)
  77.     {
  78.         Array[i].x = Array[i - 1].x + h;
  79.         Array[i].y = (*f)(Array[i].x);
  80.         cout << "(" << Array[i].x << ":" << Array[i].y << ")" << endl;
  81.     }
  82.     cout << "(" << Array[CountSegments].x << ":" << Array[CountSegments].y << ")" << endl;
  83. }
  84.  
  85. //Неравномерная сетка
  86. void ValueIrregularTable(functiontype* f, Node* Array, double Initial, double End, int CountSegments, double *Array_steps) //Инитиал и Енд запихать в Array
  87. {
  88.     int i;
  89.     double alpha,h;
  90.  
  91.     Array[0].x = Initial;
  92.     Array[CountSegments].x = End;
  93.     Array[0].y = (*f)(Array[0].x);
  94.     Array[CountSegments].y = (*f)(Array[CountSegments].x);
  95.     h = (Array[CountSegments].x - Array[0].x) / CountSegments;
  96.     Array_steps[0] = 0;
  97.     alpha = 2 * PI / CountSegments;
  98.  
  99.     cout << "(" << Array[0].x << ":" << Array[0].y << ")" << endl;
  100.     for (i = 1; i < CountSegments; i++) {
  101.         Array_steps[i] = h + cos(alpha*i);
  102.         Array[i].x = Array[i-1].x+ Array_steps[i];
  103.         Array[i].y = (*f)(Array[i].x);
  104.         cout << "(" << Array[i].x << ":" << Array[i].y << ")" << endl;
  105.     }
  106.     Array_steps[CountSegments] = Array[CountSegments].x - Array[CountSegments - 1].x;
  107.     cout << "(" << Array[CountSegments].x << ":" << Array[CountSegments ].y << ")" << endl;
  108.  
  109. }
  110.  
  111.  
  112. /* Принимает на вход коэффициенты матриц в виде массива. Заполняет массив прогоночных коэффициентов
  113.  matrix_coeffs - двумерный массив вида [[a1,b1,c1,d1],[a2,b2,c2,d2],...,[an,bn,cn,dn]
  114. надо сделать чтобы а1=с1=0, переделать под ашки
  115. */
  116. void tridiagonal_matrix_algorithm(double** matrix_coeffs, int matrix_size) {
  117.     int i;
  118.     double denominator;
  119.     double K, E, K_prev = 0, E_prev = 0; //Прогоночные коэффициенты
  120.     double* x_massiv = new double[matrix_size];
  121.  
  122.     double** coeffs_massiv; //Двумерный массив, хранящий прогоночные коэффициенты, 0 - Кси, 1 - Эта
  123.     coeffs_massiv = new double*[matrix_size+1];
  124.     for (i = 0; i < matrix_size; i++)
  125.         coeffs_massiv[i] = new double[2];
  126.  
  127.     coeffs_massiv[0][0] = 0; coeffs_massiv[0][1] = 0;
  128.     matrix_coeffs[0][0] = 0; matrix_coeffs[matrix_size - 1][2] = 0; //а1=с1=0
  129.    
  130.     //Прямой ход
  131.     for (i = 1; i <= matrix_size; i++) { //Ищем K_i+1 и E_i+1 на iом шаге
  132.         denominator = (matrix_coeffs[i - 1][0] * K_prev + matrix_coeffs[i - 1][1]);
  133.         K = -(matrix_coeffs[i - 1][2]) / denominator;
  134.         E = (matrix_coeffs[i - 1][3] - matrix_coeffs[i - 1][0] * E_prev) / denominator;
  135.         K_prev = K;
  136.         E_prev = E;
  137.         coeffs_massiv[i][0] = K; coeffs_massiv[i][1] = E;
  138.     }
  139.  
  140.     //Обратный ход
  141.     x_massiv[matrix_size - 1] = coeffs_massiv[matrix_size][1];
  142.     for (i = matrix_size - 2; i >= 0; i--) {
  143.         x_massiv[i] = coeffs_massiv[i + 1][0] * x_massiv[i + 1] + coeffs_massiv[i + 1][1];
  144.     }
  145.    
  146. }
  147.  
  148. void get_matrix_coeffs(double Initial, double End, int matrix_size, functiontype* f, double** matrix_coeffs, Node* Array, double *Array_steps) {
  149.     int i;
  150.     double h1,h2,h_prev;
  151.     //double* gamma_massiv = new double[matrix_size]; //Гаммы яв решением ур, т.е. ответом.
  152.  
  153.  
  154.     for (i = 1; i <= matrix_size; i++) {
  155.         h1 = Array_steps[i]; //i
  156.         h2 = Array_steps[i+1];; //i+1
  157.         h_prev = h2;
  158.         matrix_coeffs[i - 1][0] = h1;
  159.         matrix_coeffs[i - 1][1] = 2*(h1+h2);
  160.         matrix_coeffs[i - 1][2] = h2;
  161.         matrix_coeffs[i - 1][3] = 6*(  (Array[i+1].y- Array[i].y) / h2 - (Array[i].y - Array[i-1].y)/h1  );
  162.         //cout << matrix_coeffs[i - 1][0] << " " << matrix_coeffs[i - 1][1] << " " << matrix_coeffs[i - 1][2] << " " << endl;
  163.     }
  164.     //matrix_coeffs[matrix_size][3] = 6 * ((Array[i + 1].y - Array[i].y) / h2 - (Array[i].y - Array[i - 1].y) / h1);
  165.     h1 = Array_steps[matrix_size];
  166.     h2 = Array_steps[matrix_size+1];
  167.     y1 = Array[matrix_size].y;
  168.     y2 = Array[matrix_size + 1].y;
  169.     x1 = Array[matrix_size].x;
  170.     x2 = Array[matrix_size + 1].x;
  171.     matrix_coeffs[matrix_size-1][0] = h1;
  172.     matrix_coeffs[matrix_size-1][1] = 2 * (h1 + h2);
  173.     matrix_coeffs[matrix_size - 1][2] = 0;
  174.     matrix_coeffs[matrix_size-1][3] = 6 * ((Array[i + 1].y - Array[i].y) / h2 - (Array[i].y - Array[i - 1].y) / h1);
  175.     matrix_coeffs[0][0] = 0;
  176.     d2 = h2/6 * 6*(B*h2- y2+ y1) / (  (x2- x1)*(x2 - x1)*((x2 - x1)-h2*h2)   )
  177.     g2 = h2/6 * h2*h2 / ( (x2-x1)*(   (x2-x1)*(x2-x1)-h2*h2   ))  
  178.  
  179. }
  180.  
  181. int main()
  182. {
  183.     setlocale(LC_ALL, "RUS");
  184.     functiontype Func = &Myfunc;
  185.     double Initial = 0, End = 5;
  186.     int CountSegments,i;
  187.     cout << "Введите N: ";
  188.     cin >> CountSegments;
  189.     cout << "Точек: " << CountSegments + 1 << endl << endl;
  190.     double *Array_steps = new double[CountSegments + 1];
  191.  
  192.     //Построение сетки
  193.     cout << "Равномерная Сетка: " << endl;
  194.     Node* ArrayUniformNodes = new Node[CountSegments+1];
  195.     ValueUniformTable(&Func, ArrayUniformNodes, Initial, End, CountSegments);
  196.  
  197.     cout << endl << "Неравномерная Сетка: " << endl;
  198.     Node* ArrayIrregulaNodes = new Node[CountSegments + 1];
  199.     ValueIrregularTable(&Func, ArrayIrregulaNodes, Initial, End, CountSegments, Array_steps);
  200.     cout << endl;
  201.  
  202.     //Заполнение массива коэффициентами матрицы
  203.     double** matrix_coeffs;
  204.     matrix_coeffs = new double*[CountSegments-1];
  205.     for (i = 0; i < CountSegments-1; i++)
  206.         matrix_coeffs[i] = new double[3];
  207.  
  208.     cout << "Полученная матрица: " << endl;
  209.     get_matrix_coeffs(Initial,End, CountSegments-1, &Func, matrix_coeffs, ArrayIrregulaNodes, Array_steps);
  210.  
  211.     /*
  212.     //Получение ответа в x_massiv
  213.     double* x_massiv = new double[CountSegments+1];
  214.     tridiagonal_matrix_algorithm(matrix_coeffs, CountSegments+1);
  215.     */
  216.  
  217.     cout << endl;
  218.     system("pause");
  219.     return 0;
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement