Advertisement
DarkDevourer

Метод Гаусса

Sep 13th, 2020 (edited)
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.29 KB | None | 0 0
  1. #include <iostream>
  2. #include<math.h>
  3. #include <random>
  4.  
  5. using namespace std;
  6.  
  7. double** array1;
  8. double* x;
  9. double* r;
  10.  
  11. int main()
  12. {
  13. int n, i, j, k, choise;
  14. int min, range, t;
  15. double s;
  16.  
  17. setlocale(LC_ALL, "RUSSIAN");
  18. cout << "Решение систем уравнени методом Гаусса.\n";
  19. cout << "1 - случайное заполнение коэффициентов\n2 - ввод коэфициентов с клавиатуры\n3 - использование шаблонной системы\n";
  20. cin >> choise;
  21. n = 3;
  22. if ((choise == 1) || (choise == 2))
  23. {
  24. cout << "Введите число переменных: ";
  25. cin >> n;
  26. }
  27. array1 = new double* [n];
  28. for (i = 0; i < n; i++)
  29. array1[i] = new double [n + 1];
  30. x = new double[n];
  31. r = new double[n];
  32.  
  33. if (choise == 1)
  34. {
  35. cout << "Введите минимальный возможны коэффициент: ";
  36. cin >> min;
  37. cout << "Введите диапозон: ";
  38. cin >> range;
  39. cout << "Коэффициенты заполнятся случайными числами от "<<min<<" до "<<range-min-1<<"20.\n";
  40. for (i = 0; i < n; i++)
  41. for (j = 0; j < n + 1; j++)
  42. array1[i][j] = (rand() % range + min);
  43. }
  44. else if (choise == 2)
  45. {
  46. for (i = 0; i < n; i++)
  47. {
  48. cout << "Введите коэффициенты для " << i + 1 << "-ой строки и результат уравнения " << i + 1 << "-ой строки:\n";
  49. for (j = 0; j < n + 1; j++)
  50. cin >> array1[i][j];
  51. }
  52. }
  53. else
  54. {
  55. array1[0][0] = 10.1;
  56. array1[0][1] = -1.35;
  57. array1[0][2] = 0.9;
  58. array1[0][3] = 9.9;
  59. array1[1][0] = 0.95;
  60. array1[1][1] = -0.7;
  61. array1[1][2] = 2.35;
  62. array1[1][3] = 10.2;
  63. array1[2][0] = 1.75;
  64. array1[2][1] = -2.63;
  65. array1[2][2] = 13.44;
  66. array1[2][3] = 11.0;
  67. }
  68.  
  69. for (i = 0; i < n; i++)
  70. {
  71. cout << array1[i][0] << "*x" <<1;
  72. for (j=1;j<n;j++)
  73. cout <<" + "<< array1[i][j] << "*x" << j + 1;
  74. cout << " = " << array1[i][n] << endl;
  75. }
  76.  
  77. for (i = 0; i < n - 1; i++)
  78. {
  79. t = 0;
  80. for (j = 0; j < n + 1; j++)
  81. {
  82. if (array1[i][j] == 0)
  83. t++;
  84. }
  85. if (t == n && abs(array1[i][n])>0.00001)
  86. {
  87. cout << "Ранг матрицы A меньше ранга матрицы A|B, решенией системы нет." << endl;
  88. return(0);
  89. }
  90. if (t == n + 1)
  91. {
  92. r[i] = 1;
  93. continue;
  94. }
  95. else
  96. {
  97. r[i] = 0;
  98. }
  99.  
  100. for (j = i + 1; j < n; j++)
  101. {
  102. s = array1[j][i] / array1[i][i];
  103. for (k = i; k < n; k++)
  104. array1[j][k] = array1[j][k] - s * array1[i][k];
  105. array1[j][n] = array1[j][n] - s * array1[i][n];
  106. }
  107. }
  108. t = 0;
  109. for (j = 0; j < n + 1; j++)
  110. {
  111. if (array1[n-1][j] == 0)
  112. t++;
  113. }
  114. if (t == n && abs(array1[i][n]) > 0.00001)
  115. {
  116. cout << "Ранг матрицы A меньше ранга матрицы A|B, решенией системы нет." << endl;
  117. return(0);
  118. }
  119. if (t == n + 1)
  120. {
  121. r[n-1] = 1;
  122. }
  123. else
  124. {
  125. r[n-1] = 0;
  126. }
  127.  
  128. for (i = n - 1; i >= 0; i--)
  129. {
  130. if (r[i] == 1)
  131. x[i] = 1;
  132. else
  133. x[i] = 0;
  134. }
  135. for (i = n-1; i >= 0; i--)
  136. {
  137. if (r[i] !=1)
  138. {
  139. x[i] = array1[i][n];
  140. for (j = 0; j < n ; j++)
  141. if (j!=i)
  142. x[i] = x[i] - array1[i][j] * x[j];
  143. x[i] = x[i] / array1[i][i];
  144.  
  145. }
  146. }
  147. for (i = 0; i < n; i++)
  148. {
  149. cout << "x" << i + 1 << " = " << x[i];
  150. if (r[i] == 1)
  151. cout << " (корень был выбран как 1, но он является свободным и может принимать любое значение)";
  152. cout << endl;
  153. }
  154. }
  155.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement