vadimk772336

Untitled

Feb 16th, 2020
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.12 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. typedef double(*functiontype)(double x);
  14. typedef struct Node
  15. {
  16.     double x, y;
  17. } Node;
  18. typedef double(*method)(double x, Node* Array, int Count, double* DD_massiv);
  19. typedef struct Interval
  20. {
  21.     double InitialNode, EndNode;
  22. } Interval;
  23.  
  24. //Равномерная сетка
  25. void ValueUniformTable(functiontype* f, Node* Array, double Initial, double End, int CountNodes)
  26. {
  27.     double step = abs(Initial - End) / (CountNodes - 1);
  28.     Array[0].x = Initial; Array[0].y = (*f)(Array[0].x);
  29.     for (int i = 1; i < CountNodes; i++)
  30.     {
  31.         Array[i].x = Array[i - 1].x + step;
  32.     }
  33. }
  34.  
  35. //Неравномерная сетка
  36. void ValueIrregularTable(functiontype* f, Node* Array, double Initial, double End, int CountNodes)
  37. { // Создание таблицы Чебышевских значений
  38.     for (int i = 0; i < CountNodes; i++)
  39.     {
  40.         Array[i].x = ;
  41.         Array[i].y = (*f)(Array[i].x);
  42.     }
  43. }
  44.  
  45. double Myfunc(double x)
  46. {
  47.     return x * x;
  48. }
  49. functiontype Func = &Myfunc;
  50.  
  51. /* Принимает на вход коэффициенты матриц в виде массива. Заполняет массив прогоночных коэффициентов
  52.  matrix_coeffs - двумерный массив вида [[a1,b1,c1,d1],[a2,b2,c2,d2],...,[an,bn,cn,dn]
  53. надо сделать чтобы а1=с1=0, переделать под ашки
  54. */
  55. void tridiagonal_matrix_algorithm(double** matrix_coeffs, int matrix_size) {
  56.     int i;
  57.     double denominator;
  58.     double K, E, K_prev = 0, E_prev = 0; //Прогоночные коэффициенты
  59.     double* x_massiv = new double[matrix_size];
  60.  
  61.     double** coeffs_massiv; //Двумерный массив, хранящий прогоночные коэффициенты, 0 - Кси, 1 - Эта
  62.     coeffs_massiv = new double*[matrix_size+1];
  63.     for (i = 0; i < matrix_size; i++)
  64.         coeffs_massiv[i] = new double[2];
  65.  
  66.     coeffs_massiv[0][0] = 0; coeffs_massiv[0][1] = 0;
  67.     matrix_coeffs[0][0] = 0; matrix_coeffs[matrix_size - 1][2] = 0; //а1=с1=0
  68.    
  69.     //Прямой ход
  70.     for (i = 1; i <= matrix_size; i++) { //Ищем K_i+1 и E_i+1 на iом шаге
  71.         denominator = (matrix_coeffs[i - 1][0] * K_prev + matrix_coeffs[i - 1][1]);
  72.         K = -(matrix_coeffs[i - 1][2]) / denominator;
  73.         E = (matrix_coeffs[i - 1][3] - matrix_coeffs[i - 1][0] * E_prev) / denominator;
  74.         K_prev = K;
  75.         E_prev = E;
  76.         coeffs_massiv[i][0] = K; coeffs_massiv[i][1] = E;
  77.     }
  78.  
  79.     //Обратный ход
  80.     x_massiv[matrix_size - 1] = coeffs_massiv[matrix_size][1];
  81.     for (i = matrix_size - 2; i >= 0; i--) {
  82.         x_massiv[i] = coeffs_massiv[i + 1][0] * x_massiv[i + 1] + coeffs_massiv[i + 1][1];
  83.     }
  84.    
  85. }
  86.  
  87. void get_matrix_coeffs(double Initial, double End, int matrix_size, functiontype* f, double** matrix_coeffs) {
  88.     int i;
  89.     double h1,h2,h_prev;
  90.     //double* gamma_massiv = new double[matrix_size]; //Гаммы яв решением ур, т.е. ответом.
  91.  
  92.     matrix_coeffs = new double*[matrix_size];
  93.     for (i = 0; i < matrix_size; i++)
  94.         matrix_coeffs[i] = new double[3];
  95.  
  96.  
  97.     for (i = 1; i <= matrix_size; i++) {
  98.         h1 = Array[i].x - Array[i-1].x;  //i
  99.         h2 = Array[i+1].x - Array[i].x; //i+1
  100.         h_prev = h2;
  101.         matrix_coeffs[i - 1][0] = h1;
  102.         matrix_coeffs[i - 1][1] = 2*(h1+h2);
  103.         matrix_coeffs[i - 1][1] = h2;
  104.     }
  105.  
  106. }
  107.  
  108. int main()
  109. {
  110.     setlocale(LC_ALL, "RUS");
  111.     functiontype Func = &Myfunc;
  112.     double Initial = 0, End = 5;
  113.     int CountNodes;
  114.     cout << "Введите число точек: ";
  115.     cin >> CountNodes;
  116.  
  117.     Node* ArrayUniformNodes = new Node[CountNodes];
  118.     ValueUniformTable(&Func, ArrayUniformNodes, Initial, End, CountNodes);
  119.  
  120.  
  121.     //Заполнение массива коэффициентами матрицы
  122.     double** matrix_coeffs;
  123.     get_matrix_coeffs(Initial,End, CountNodes, &Func, matrix_coeffs);
  124.  
  125.     //Получение ответа в x_massiv
  126.     double* x_massiv = new double[CountNodes];
  127.     tridiagonal_matrix_algorithm(matrix_coeffs, CountNodes);
  128.  
  129.     cout << endl;
  130.     system("pause");
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment