vadimk772336

Untitled

Apr 3rd, 2020
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.55 KB | None | 0 0
  1. /*
  2. plot "D:\graphic.txt" with lines title "(x_i, U_i)"
  3. */
  4. #include <iostream>
  5. #include <math.h>
  6. #include <cmath>
  7. #include <stdlib.h>
  8. #include <fstream>
  9. using namespace std;
  10. const double PI = 3.141592653589793238463;
  11.  
  12. //Задание функции
  13. typedef double(*functiontype1)(double x);
  14. typedef double(*functiontype2)(double x, double s);
  15. double f(double x)
  16. {
  17.     return x * x * x;
  18. }
  19. double K(double x, double s)
  20. {
  21.     return x * x + s * s;
  22. }
  23. functiontype1 Func1 = &f;
  24. functiontype2 Func2 = &K;
  25.  
  26. //Задает набор узлов, равномерно удаленных друг от друга
  27. void ValueUniformTable(double* Array, double Initial, double End, int CountDots)
  28. {
  29.     double h = abs(End - Initial) / (CountDots - 1);
  30.     Array[0] = Initial;
  31.     for (int i = 1; i < CountDots; i++)
  32.         Array[i] = Array[i - 1] + h;
  33. }
  34.  
  35. //Задает набор узлов по Чебышеву
  36. void ValueChebyshevTable(double* Array, double Initial, double End, int CountDots)
  37. {
  38.     double k1, k2, denom;
  39.  
  40.     Array[0] = Initial;
  41.     Array[CountDots - 1] = End;
  42.  
  43.     k1 = (End + Initial) / 2;
  44.     k2 = (End - Initial) / 2;
  45.     denom = 2 * (CountDots);
  46.  
  47.     for (int i = 1; i < CountDots - 1; i++)
  48.         Array[CountDots - 1 - i] = k1 + k2 * cos(((2 * i + 1) * PI) / (denom));
  49. }
  50.  
  51.  
  52. void Gaussian_elimination(double** coeffs_massiv, double* y_Massiv, double* U_massiv, int n) {
  53.  
  54.     double* tmp_mas;
  55.     tmp_mas = new double[n];
  56.     //double tmp_mas[n];
  57.  
  58.     int i, j, k, index;
  59.     double tmp, max, r;
  60.  
  61.     for (j = 0; j <= n - 2; j++) {
  62.  
  63.         max = abs(coeffs_massiv[j][j]);
  64.         index = j;
  65.  
  66.         //Поиск строки с макс по модулю элементом в jом столбце
  67.         for (i = index + 1; i <= n - 1; i++) { // Идем по  столбцу index=j  до самого низа
  68.             if (abs(coeffs_massiv[i][index]) > max) {
  69.                 max = abs(coeffs_massiv[i][index]);
  70.                 index = i;
  71.             }
  72.         } //index хранит строку с макс эл в jом столбце
  73.         cout << "max: " << coeffs_massiv[index][j] << endl;
  74.         cout << "Переставляем " << j << " и " << index << " строку " << endl;
  75.  
  76.         //Реализация перестановки 2х строк: j-ой и найденной = index перед итерацией Гаусса
  77.         if (index != j) {
  78.             for (i = 0; i <= n - 1; i++) {
  79.                 tmp_mas[i] = coeffs_massiv[j][i];
  80.                 coeffs_massiv[j][i] = coeffs_massiv[index][i];
  81.                 coeffs_massiv[index][i] = tmp_mas[i];
  82.             }
  83.             tmp = y_Massiv[j]; //правая часть Jой строки
  84.             y_Massiv[j] = y_Massiv[index];
  85.             y_Massiv[index] = tmp;
  86.         }
  87.  
  88.  
  89.         // Будем Jой строкой убивать jые элементы во всех строках находящихся ниже
  90.         for (i = j + 1; i <= n - 1; i++) { //фиксируем iую строку (это внутри цикла для jj элемента)
  91.             r = -coeffs_massiv[i][j] / coeffs_massiv[j][j];
  92.  
  93.             for (k = j; k <= n - 1; k++) { //Домножили jую и сложили с ioй - изменилась iая строка
  94.                 coeffs_massiv[i][k] = coeffs_massiv[i][k] + r * coeffs_massiv[j][k];
  95.             }
  96.             y_Massiv[i] = y_Massiv[i] + r * y_Massiv[j];
  97.         }
  98.     }
  99.  
  100.     //обратная подстановка
  101.     U_massiv[n - 1] = y_Massiv[n - 1] / coeffs_massiv[n - 1][n - 1];  //Первый шаг длаем сами
  102.     for (i = n - 2; i >= 0; i--) { //фиксируем iую строку - будем искать xi
  103.         tmp = 0;
  104.         for (int j = i + 1; j <= n - 1; j++)
  105.             tmp += coeffs_massiv[i][j] * U_massiv[j]; //Переносим вправо всё что известно и суммируем, но в отдельную переменную чтобы не испортить правую часть.
  106.         U_massiv[i] = (y_Massiv[i] - tmp) / coeffs_massiv[i][i];
  107.     }
  108. }
  109.  
  110.  
  111. //Запись в файл (x_i, U_i)
  112. void table_in_file(double* x_Array, int CountDots, double* U_massiv)
  113. {
  114.     ofstream fout("D:/graphic.txt");
  115.     for (int i = 0; i < CountDots; i++)
  116.         fout << x_Array[i] << " " << U_massiv[i] << endl;
  117.  
  118.     fout.close();
  119.     cout << "Запись в файл осуществлена!" << endl;
  120. }
  121.  
  122. void get_coeffs_massiv(functiontype2* K, functiontype1* f, int CountDots, double** coeffs_massiv, double* x_Array, double* y_Array) {
  123.     int i, j;
  124.  
  125.     for (i = 0; i < CountDots; i++) {
  126.         for (j = 0; j < CountDots; j++) {
  127.             if (j == 0)
  128.                 coeffs_massiv[i][j] = 1;
  129.             else
  130.                 coeffs_massiv[i][j] = -(x_Array[j] - x_Array[j - 1]) * (*K)(x_Array[i], x_Array[j]);
  131.         }
  132.         y_Array[i] = (*f)(x_Array[i]);
  133.     }
  134.  
  135. }
  136.  
  137. int main()
  138. {
  139.     setlocale(LC_ALL, "RUS");
  140.     int i, j;
  141.  
  142.     /*---------------------------------Входные данные-------------------------------------*/
  143.     double Initial = -5, End = 5;
  144.     int CountDots = 3; //Количество узлов (иксов)
  145.  
  146.  
  147.     /*---------------------------------Задаём необходимые массивы-------------------------*/
  148.     double** coeffs_massiv; //массив хранящий коэффициенты СЛАУ
  149.     coeffs_massiv = new double* [CountDots];
  150.     for (i = 0; i < CountDots; i++)
  151.         coeffs_massiv[i] = new double[2];
  152.  
  153.     double* U_massiv = new double[CountDots]; //Хранит U_i
  154.     double* y_Array = new double[CountDots]; //Правая часть СЛАУ
  155.     double* x_Array = new double[CountDots]; //Узлы
  156.  
  157.  
  158.     /*---------------------------------Заполняем и решаем---------------------------------*/
  159.     ValueUniformTable(x_Array, Initial, End, CountDots); //Строим сетку
  160.     get_coeffs_massiv(&Func2, &Func1, CountDots, coeffs_massiv, x_Array, y_Array); //Строим СЛАУ
  161.     cout << endl << "Полученная СЛАУ: " << endl;
  162.     for (i = 0; i < CountDots; i++) {
  163.         for (int j = 0; j < CountDots; j++) {
  164.             cout << coeffs_massiv[i][j] << " ";
  165.         }
  166.         cout << y_Array[i] << endl;
  167.         cout << endl;
  168.     }
  169.     Gaussian_elimination(coeffs_massiv, y_Array, U_massiv, CountDots); //Гауссим и получаем ответ - U_massiv
  170.  
  171.     table_in_file(x_Array, CountDots, U_massiv);
  172.  
  173.  
  174.     /*---------------------------------Вывод в консоль------------------------------------*/
  175.    
  176.     cout << endl << "Полученная СЛАУ: " << endl;
  177.     for (i = 0; i < CountDots; i++) {
  178.         for (int j = 0; j < CountDots; j++) {
  179.             cout << coeffs_massiv[i][j] << " ";
  180.         }
  181.         cout << y_Array[i] << endl;
  182.         cout << endl;
  183.     }
  184.  
  185.     cout << endl << "Узлы: " << endl;
  186.     for (j = 0; j < CountDots; j++) {
  187.         cout << x_Array[j] << " ";
  188.     }
  189.  
  190.     cout << endl << "U_massiv: " << endl;
  191.     for (j = 0; j < CountDots; j++) {
  192.         cout << U_massiv[j] << " ";
  193.     }
  194.    
  195.  
  196.     cout << endl;
  197.     system("pause");
  198.     return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment