Advertisement
noler89

Untitled

May 5th, 2016
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. void gauss (Matrix A1, double *b1) {
  2. Matrix A = new Matrix (A1.M, A1.n);
  3. int n = A.n;
  4. double *b = new double[n];
  5. for (int i = 0; i<n; i++)
  6. b[i] = b1[i];
  7. double *x = new double[n];
  8. for (int i = 0; i<n; i++){
  9. if (A.M[i][i] == 0){
  10. int bool = 0;
  11. for (int k = i + 1; k<n; k++){
  12. if (A.M[k][i] != 0){
  13. bool = 1;
  14. for (int c = 0; c<n; c++){
  15. double tmp = A.M[i][c];
  16. A.M[i][c] = A.M[k][c];
  17. A.M[k][c] = tmp;
  18. }
  19. double tmp = b[i];
  20. b[i] = b[k];
  21. b[k] = tmp;
  22. break;
  23. }
  24. }
  25. if (bool == 0){
  26. std::cout << "простой метод Гаусса не применим";
  27. return;
  28. }
  29. }
  30. for (int j = i + 1; j<n; j++){
  31. b[j] = (b[j] / A.M[j][i])*A.M[i][i] - b[i];
  32. for (int k = n - 1; k >= i; k--)
  33. A.M[j][k] = (A.M[j][k] / A.M[j][i])*A.M[i][i] - A.M[i][k];
  34. }
  35. }
  36. x[n - 1] = b[n - 1] / A.M[n - 1][n - 1];
  37. for (int i = n - 2; i >= 0; i--){
  38. double sum = b[i];
  39. for (int j = n - 1; j>i; j--)
  40. sum = sum - A.M[i][j] * x[j];
  41. x[i] = sum / A.M[i][i]; }
  42. std::cout << "Решение методом Гаусса:";
  43. for (int i = 0; i<n; i++)
  44. std::cout << x[i] << "\t";
  45. std::cout << "\n";
  46. }
  47. void Seidel (Matrix M, double* b, double eps) {
  48. Matrix A = new Matrix (M.M, M.n);
  49. _Vector vb = new _Vector (b, M.n);
  50. int n = A.n;
  51. Matrix C = new Matrix (n);
  52. _Vector d = new _Vector (n);
  53. for (int i = 0; i<n; i++){
  54. C.M[i][i] = 0;
  55. if (A.M[i][i] == 0){
  56. std::cout << ("Матрица не является матрицей с диагональным преобладанием");
  57. if (!A.isPositiveDefine ()){
  58. std::cout<< ("Матрица не является матрицей с диагональным преобладанием или она не положительно определена");
  59. return;
  60. }
  61. }
  62. d.v[i] = b[i] / A.M[i][i];
  63. for (int j = 0; j<n; j++){
  64. if (i == j)
  65. continue;
  66. C.M[i][j] = -A.M[i][j] / A.M[i][i];
  67. }
  68. }
  69. _Vector x1 = new _Vector (d.v, n);
  70. _Vector x2 = new _Vector (n);
  71. _Vector x3 = new _Vector (n);
  72. int count = 0;
  73. while ((x1.substraction (x2)).normInf ()>eps){
  74. for (int i = 0; i<n; i++)
  75. x2.v[i] = x1.v[i];
  76. double no;
  77. int k = -1;
  78. for (int i = 0; i<n; i++){
  79. double sum = 0;
  80. for (int j = 0; j<n; j++){
  81. double x;
  82. if (j>k)
  83. x = x1.v[j];
  84. else
  85. x = x3.v[j];
  86. sum = sum + C.M[i][j] * x;
  87. }
  88. sum = sum + d.v[i];
  89. k++;
  90. x3.v[i] = sum;
  91. }
  92. for (int i = 0; i<n; i++)
  93. x1.v[i] = x3.v[i];
  94. no = (x1.substraction (x2)).normInf ();
  95. count++;
  96. }
  97. std::cout << "Решение методом Зейделя. "";
  98. std::cout << "Всего " << count << " шагов:";
  99. x1.display ();
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement