Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.18 KB | None | 0 0
  1. //
  2. // main.cpp
  3. // lab1
  4. //
  5. // Created by Anastasia on 14.02.2020.
  6. // Copyright © 2020 Anastasia. All rights reserved.
  7. //
  8.  
  9. #include <cmath>
  10. #include <iostream>
  11.  
  12. void inversion(float** A, int N);
  13.  
  14. int main(int argc, const char * argv[]) {
  15. int n = 0;
  16.  
  17. std::cout << "Enter size of matrix \n";
  18. std::cin >> n;
  19.  
  20. float *diag_a = new float[n];
  21. float *diag_b = new float[n-1];
  22. float *diag_c = new float[n-1];
  23. float *free_d = new float[n];
  24.  
  25. std::cout << "Enter main diagonal \n";
  26. for (int i=0; i<n; i++) {
  27. std::cin >> diag_a[i];
  28. }
  29.  
  30. std::cout << "Enter upper diagonal \n";
  31. for (int i=0; i<n-1; i++) {
  32. std::cin >> diag_b[i];
  33. }
  34.  
  35. std::cout << "Enter lower diagonal \n";
  36. for (int i=0; i<n-1; i++) {
  37. std::cin >> diag_c[i];
  38. }
  39.  
  40. std::cout << "Enter free numbers d \n";
  41. for (int i=0; i<n; i++) {
  42. std::cin >> free_d[i];
  43. }
  44.  
  45. float *alpha = new float[n-1];
  46. float *beta = new float[n-1];
  47. float *x = new float[n];
  48.  
  49. //-------------------------------
  50. for (int i=1; i<n-1; i++) {
  51. if (std::abs(diag_a[i]) < std::abs(diag_c[i-1] + diag_b[i])) {
  52. std::cout << "Input is incorrect 1 stat ";
  53. }
  54. if (std::abs(diag_b[i])/(std::abs(diag_a[i])) > 1) {
  55. std::cout << "Input is incorrect 2 stat";
  56. }
  57. if (std::abs(diag_c[i-1]) / (std::abs(diag_b[i])) > 1) {
  58. std::cout << "Input is incorrect 3 stat";
  59. }
  60. }
  61.  
  62. if (diag_a[0] != 0) {
  63. alpha[0] = - diag_b[0]/diag_a[0];
  64. std::cout << "alpha[" << "0" <<"]= " << alpha[0];
  65. } else {
  66. std::cout << "a[0] = 0 error";
  67. return 1;
  68. }
  69. beta[0] = free_d[0] / diag_a[0];
  70. std::cout << "beta[" << "0" <<"]= " << beta[0];
  71.  
  72. for (int i=1; i<n-1; i++) {
  73. alpha[i] = -(diag_b[i])/(alpha[i-1]*diag_c[i-1] + diag_a[i]);
  74. beta[i] = (free_d[i]-diag_c[i-1]*beta[i-1])/(alpha[i-1]*diag_c[i-1] + diag_a[i]);
  75. std::cout << "alpha[" << i <<"]= " << alpha[i] << " ";
  76. std::cout << "beta[" << i <<"]= " << beta[i] << " ";
  77. }
  78. beta[n-1] = (free_d[n-1]-diag_c[n-2]*beta[n-2])/(alpha[n-2]*diag_c[n-2] + diag_a[n-1]);
  79. std::cout << "beta[" << n-1 <<"]= " << beta[n-1] << " ";
  80.  
  81. alpha[n-1] = -(diag_b[n-1-1])/(alpha[n-1-1]*diag_c[n-1-1] + diag_a[n-1-1]);
  82. //std::cout << " --- "<< diag_b[n-1] << " " << alpha[n-1-1] << " " << diag_c[n-1-1] << " " << diag_a[n-1] << " --- ";
  83. std::cout << "alpha[" << n-1 <<"]= " << alpha[n-1] << std::endl;
  84. x[n-1] = beta[n-1];
  85.  
  86. for (int i=n-2; i>=0; i--) {
  87. x[i] = alpha[i]*x[i+1] + beta[i];
  88. }
  89.  
  90. for (int i=0; i<n; i++) {
  91. std::cout << "x[" << i << "]= " << x[i] << std::endl;
  92. }
  93.  
  94. //---------2------------
  95. float *r = new float[n];
  96. float *e = new float[n];
  97. float *d = new float[n];
  98.  
  99. float **matrix = new float*[n];
  100. for (int i = 0; i < n; i++) {
  101. matrix[i] = new float[n];
  102. }
  103.  
  104.  
  105. matrix[0][0] = 3; matrix[0][1] = 1; matrix[0][2] = 0; matrix[0][3] = 0;
  106. matrix[1][0] = 1; matrix[1][1] = 3; matrix[1][2] = 1; matrix[1][3] = 0;
  107. matrix[2][0] = 0; matrix[2][1] = 1; matrix[2][2] = 3; matrix[2][3] = 1;
  108. matrix[3][0] = 0; matrix[3][1] = 0; matrix[3][2] = 1; matrix[3][3] = 3;
  109.  
  110.  
  111. //matrix[0][0] = 0.2679; matrix[0][1] = -0.0717; matrix[0][2] = 0.0191; matrix[0][3] = -0.0047;
  112. //matrix[1][0] = -0.0717; matrix[1][1] = 0.2870; matrix[1][2] = -0.0765; matrix[1][3] = 0.0191;
  113. //matrix[2][0] = 0.0191; matrix[2][1] = -0.0765; matrix[2][2] = 0.2870; matrix[2][3] = -0.0717;
  114. //matrix[3][0] = -0.0047; matrix[3][1] = 0.0191; matrix[3][2] = -0.0717; matrix[3][3] = 0.2679;
  115.  
  116.  
  117.  
  118.  
  119.  
  120. for (int i=0; i<n; i++) {
  121. for (int j=0; j<n; j++) {
  122. d[i] += matrix[i][j] * x[j];
  123. }
  124. std::cout << "d[" <<i<<"]= " << d[i] << std::endl;
  125. }
  126.  
  127. for(int i=0; i<n; i++) {
  128. r[i] = free_d[i]-d[i];
  129. std::cout << "r[" <<i<<"]= " << r[i] << std::endl;
  130. }
  131.  
  132. inversion(matrix, n);
  133.  
  134. for (int i=0; i<4; i++) {
  135. for (int j=0; j<4; j++) {
  136. std::cout << matrix[i][j] << " ";
  137. }
  138. std::cout << std::endl;
  139. }
  140.  
  141. for (int i=0; i<4; i++) {
  142. //sum = 0;
  143. for (int j=0; j<n; j++) {
  144. e[i]+= matrix[i][j] * r[j];
  145. }
  146. }
  147.  
  148. std::cout << "error: " << std::endl;
  149. for (int i=0; i<4; i++) {
  150. printf("%.15f", e[i]);
  151. std::cout << " " << std::endl;
  152. }
  153.  
  154. for (int i=0; i<4; i++) {
  155. float c =x[i]-e[i];
  156. std::cout << "x[" << i+1 << "]= ";
  157. printf("%.15f", c);
  158. std::cout << std::endl;
  159. }
  160.  
  161. return 0;
  162. }
  163.  
  164. void inversion(float** A, int N)
  165. {
  166. double temp;
  167.  
  168. float **E = new float*[N];
  169. for (int i = 0; i < N; i++) {
  170. E[i] = new float[N];
  171. }
  172.  
  173.  
  174. for (int i = 0; i < N; i++)
  175. for (int j = 0; j < N; j++)
  176. {
  177. E[i][j] = 0.0;
  178.  
  179. if (i == j)
  180. E[i][j] = 1.0;
  181. }
  182.  
  183. for (int k = 0; k < N; k++)
  184. {
  185. temp = A[k][k];
  186.  
  187. for (int j = 0; j < N; j++)
  188. {
  189. A[k][j] /= temp;
  190. E[k][j] /= temp;
  191. }
  192.  
  193. for (int i = k + 1; i < N; i++)
  194. {
  195. temp = A[i][k];
  196.  
  197. for (int j = 0; j < N; j++)
  198. {
  199. A[i][j] -= A[k][j] * temp;
  200. E[i][j] -= E[k][j] * temp;
  201. }
  202. }
  203. }
  204.  
  205. for (int k = N - 1; k > 0; k--)
  206. {
  207. for (int i = k - 1; i >= 0; i--)
  208. {
  209. temp = A[i][k];
  210.  
  211. for (int j = 0; j < N; j++)
  212. {
  213. A[i][j] -= A[k][j] * temp;
  214. E[i][j] -= E[k][j] * temp;
  215. }
  216. }
  217. }
  218.  
  219. for (int i = 0; i < N; i++)
  220. for (int j = 0; j < N; j++)
  221. A[i][j] = E[i][j];
  222.  
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement