Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.64 KB | None | 0 0
  1. #include "funcs.h"
  2. #include <bits/stdc++.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5. using namespace std;
  6.  
  7.  
  8. double skpr(double m[], double p[], int n){
  9. double sum = 0;
  10. for (int i = 0; i < n; i++) sum += m[i] * p[i];
  11. return sum;
  12. }
  13. void mult(double **A, double *b, double *c, int size){
  14. for (int i = 0; i < size; i++) {
  15. c[i] = skpr(A[i], b, size);
  16. }
  17. }
  18.  
  19. void sol(double **A, double *x, double *b, int n){
  20. int j=0; //счетчик шагов
  21. double err; //погрешность
  22. cout << "Start Gauss " << endl;
  23. double **AA = array_generator(n,n);
  24. for (int j=0; j < n; j++) for (int i=0; i < n; i++) AA[j][i]=A[j][i]; //дубликат таблицы
  25. double *bb = array_generator(n);
  26. for (int j=0; j < n; j++) bb[j]=b[j]; //дубликат таблицы
  27. double kf = 0;
  28. for (int j = 0; j < n - 1; j++){
  29. for (int i = j + 1; i < n; i++){
  30. kf = A[i][j] / A[j][j];
  31. for (int k = j; k < n; k++) {
  32. A[i][k] -= A[j][k] * kf;
  33. }
  34. b[i] -= b[j] * kf;
  35. }
  36. if (n<10){
  37. cout << "Step: " << j+1 << endl;
  38. vivod(A,x,b,n,1);
  39. cout << endl;
  40. }
  41. }
  42. double sum = 0;
  43. for (int i = n - 1; i >= 0; i--){
  44. sum = 0;
  45. for (j = i + 1; j < n; j++) {
  46. sum += A[i][j] * x[j];
  47. }
  48. x[i] = (b[i] - sum) / A[i][i];
  49. }
  50.  
  51. // cout << "Step: " << j << endl; //шаги
  52. // vivod(A,b,x,n,1);
  53. // cout << endl;
  54. cout << "Result:" <<endl;
  55. vivod(AA,bb,x,n,0);
  56.  
  57. err = check(A,b,x,n); //считаем погрешность
  58. printf_s("Err: %14e", err);
  59. cout << endl;
  60. array_destroyer(AA,n);
  61. }
  62.  
  63. double check(double **A, double *b, double *x, int size){
  64. double *err;
  65. err = new double[size];
  66. mult(A, x, err, size);
  67. for (int i = 0; i < size; i++){
  68. err[i] -= b[i];
  69. }
  70. double maxerr = 0;
  71. for (int i = 0; i < size; i++){
  72. if (maxerr < fabs(err[i])) maxerr = fabs(err[i]);
  73. }
  74. delete[]err;
  75. return maxerr;
  76. }
  77.  
  78. void vivod(double **A, double *b, double *x, int n, int c){ //Вывод матрицы (c-вывод Х или значения х)
  79. for (int j=0; j < n; j++){
  80. for (int i=0; i < n; i++){
  81. if (c==1) cout << setw(7) << fixed << setprecision(2)
  82. << A[j][i] << " * x" << ((i==n-1)?"":" + "); //магия таблицы
  83. else cout << setw(7)<< fixed << setprecision(2) << A[j][i] << " * " << setw(7)
  84. << fixed << setprecision(2) << x[i] << ((i==n-1)?"":" + "); //тоже магия таблицы
  85. }
  86. cout << " = " << b[j] << endl;
  87. }
  88. }
  89.  
  90. int read_n(){
  91. int n;
  92. cout << "Please write size array:" << endl;
  93. cin >> n;
  94. return n;
  95. }
  96.  
  97. double **array_generator_rand(int n, int m) {
  98. double **ptrary = new double * [n];
  99. srand(time(NULL));
  100. for (int i = 0; i < n; i++) {
  101. ptrary[i] = new double [m];
  102. for (int j=0; j < m; j++) ptrary[i][j]= rand() % 100;
  103. }
  104. return ptrary;
  105. }
  106.  
  107. double **array_generator(int n, int m) {
  108. double **ptrary = new double * [n];
  109. for (int i = 0; i < n; i++) {
  110. ptrary[i] = new double [m];
  111. }
  112. return ptrary;
  113. }
  114.  
  115. double *array_generator_rand(int n) {
  116. double *ptrary = new double [n];
  117. srand(time(NULL));
  118. for (int i=0; i < n; i++) ptrary[i] = rand() % 100;
  119. return ptrary;
  120. }
  121.  
  122. double *array_generator(int n) {
  123. double *ptrary = new double [n];
  124. return ptrary;
  125. }
  126.  
  127. void array_destroyer(double **ary, int n) {
  128. for (int i = 0; i < n; i++) {
  129. delete [] ary[i];
  130. }
  131. delete [] ary;
  132. }
  133.  
  134. void array_destroyer(double *ary) {
  135. delete [] ary;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement