Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <fstream>
  4. #include <string>
  5. #include <iomanip>
  6. #include <math.h>
  7. double TOLX = 1.0e-5;
  8. double TOL0 = 1.0e-5;
  9. int nmax = 15;
  10. const int SIZE = 4;
  11.  
  12. double A[SIZE][SIZE] = { {100.,1.,-2.,3.},
  13. {4.,300.,-5.,6.},
  14. {7.,-8.,400.,9.},
  15. {-10.,11.,-12.,200.} };
  16. double B[SIZE] = { 395.,603.,-415.,-606. };
  17.  
  18. double estymator(double x2[],double x1[]){
  19. double max = 0;
  20. double tab[SIZE];
  21. for (int i = 0; i < SIZE; i++) {
  22. tab[i] = x2[i] - x1[i];
  23. if (fabs(tab[i]) > max)
  24. max = fabs(tab[i]);
  25. }
  26. std::cout << "Estymator: " << max << std::endl;
  27. return max;
  28. }/*
  29. double residuum(double a[][SIZE],double b[],double x[]){
  30. double r[SIZE] = {}, max = 0;
  31. for (int i = 0; i < 4; i++) {
  32. for (int j = 0; j < 4; j++) {
  33. r[i] += A[i][j] * x[j];
  34. std::cout << r[i] << " ";
  35. }
  36. r[i] = fabs(r[i] - b[i]);
  37. if (r[i] > max)
  38. max = r[i];
  39. }
  40. for (int i = 0; i < SIZE; i++)
  41. {
  42. if (r[i] >= max)
  43. max = r[i];
  44. }
  45. std::cout << "m ax" << max << " ";
  46.  
  47. return max;
  48. }*/
  49. double reziduum(double x[], double b[], const double a[][SIZE]) {
  50.  
  51. double r[SIZE] = { 0.,0.,0.,0. };
  52. double max;
  53. for (int i = 0; i < SIZE; i++) {
  54. for (int j = 0; j < SIZE; j++) {
  55. r[i] += a[i][j] * x[j];
  56. }
  57. std::cout << r[i] << " ";
  58. r[i] = fabs(r[i] - b[i]);
  59. std::cout <<"po "<< r[i] << " ";
  60. }
  61. max = r[0];
  62. for (int i = 0; i < SIZE; i++) {
  63. std::cout << r[i] << " ";
  64. if (r[i] > max) {
  65. //std::cout << r[i] << " ";
  66. max = r[i];
  67. }
  68. }
  69. return max;
  70. }
  71. double jacobi(double arr[][SIZE], double b[SIZE]) {
  72. double D[SIZE], b2[SIZE], x2[SIZE], x1[SIZE] = { 1.,1.,1.,1. };
  73. int n = 0;
  74. //D^-1
  75. for (int i = 0; i < SIZE; i++)
  76. {
  77. D[i] = 1. / arr[i][i];
  78. arr[i][i] = 0;
  79. //ok
  80. }
  81. //b * D --> wspolczynnik c
  82. for (int i = 0; i < SIZE; i++)
  83. {
  84. b2[i] = D[i] * b[i];
  85. //ok
  86. }
  87. //przeksztalcenie macierzy A
  88. for (int i = 0; i < SIZE; i++)
  89. {
  90. for (int j = 0; j < SIZE; j++)
  91. {
  92. if(i!=j)
  93. arr[i][j] = arr[i][j] * ((-1)*D[i]);
  94. }
  95. }
  96. int num = 0;
  97. //algorytm
  98. for (int k = 0; k < nmax; k++)
  99. {
  100. for (int i = 0; i < SIZE; i++)
  101. {
  102. x2[i] = b2[i];
  103. for (int j = 0; j < SIZE; j++)
  104. {
  105. x2[i] += arr[i][j] * x1[j];
  106. }
  107. }
  108. num++;
  109. std::cout << "Iteracja " << num << " ";
  110. for (int i = 0; i < SIZE; i++)
  111. {
  112. std::cout << "x[" << i << "]=" << x2[i] << " ";
  113. }
  114. //residuum(A, B, x2);
  115. std::cout << "Residuum="<<reziduum(x2, B, A) << std::endl;
  116. if (estymator(x2, x1) < TOLX && reziduum(x2, B, A) < TOL0)break;
  117. for (int i = 0; i < SIZE; i++) {
  118. x1[i] = x2[i];
  119. }
  120. std::cout << std::endl<<std::endl;
  121. }
  122. return 0;
  123. }
  124. int main() {
  125.  
  126. double X[SIZE] = {1.,1.,1.,1.};
  127. jacobi(A, B);
  128. getchar();
  129. return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement