Advertisement
Guest User

Untitled

a guest
May 27th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include <iostream>
  3. #include <math.h>
  4. #include <fstream>
  5. #include <string>
  6. using namespace std;
  7.  
  8. double aLeft = 0.0, bRight = M_PI / 4.0;
  9. double alfa = 0.0, beta = 1.0, gamma = 0.0, fi = 0.0, psi = 1.0, theta = -0.5;
  10. double P = 1.0, Q = 0.0, R = 4.0;
  11.  
  12. double s(double x) {
  13. return tan(x);
  14. }
  15.  
  16. double analyticalSolution(double x) {
  17. return (2.0 * x * cos(2.0 * x) + 2 * sin(2.0 * x) - log(2.0) * sin(2.0 * x) - 2 * log(cos(x)) * sin(2.0 * x)) / 4.0;
  18. }
  19.  
  20. double getEstimator(double* misscalc, int N) {
  21. double e = fabs(misscalc[0]);
  22. for (int i = 1; i < N; i++)
  23. if (fabs(misscalc[i]) > e) {
  24. e = fabs(misscalc[i]);
  25. }
  26. return e;
  27. }
  28.  
  29. void thomasAlgorithm(double** A, int N) {
  30. for (int i = 1; i < N; i++) {
  31. A[1][i] -= A[2][i - 1] * A[0][i - 1] / A[1][i - 1];
  32. }
  33. }
  34.  
  35. void solution(double** A, double* b, double* x, int N) {
  36. for (int i = 1; i < N; i++) {
  37. b[i] -= A[2][i - 1] * b[i - 1] / A[1][i - 1];
  38. }
  39.  
  40. x[N - 1] = b[N - 1] / A[1][N - 1];
  41.  
  42. for (int i = N - 2; i >= 0; i--) {
  43. x[i] = (b[i] - A[0][i] * x[i + 1]) / A[1][i];
  44. }
  45. }
  46.  
  47. void saveData(double* x, double h, int i, string name) {
  48. double x_i = aLeft;
  49. std::fstream file;
  50. file.open(name, fstream::out);
  51. file.precision(15);
  52. for (int j = 0; j < i; j++) {
  53. file << x_i << " " << x[j] << " " << analyticalSolution(x_i) << " " << endl;
  54. x_i += h;
  55. }
  56. file.close();
  57. }
  58.  
  59. double conventional(double h, int i) {
  60. double** A = new double*[3];
  61. A[0] = new double[i - 1]; //upper
  62. A[1] = new double[i]; //diagonal
  63. A[2] = new double[i - 1]; //lower
  64. double* b = new double[i];
  65. double* misscalc = new double[i];
  66. double* x = new double[i];
  67. double x_i = aLeft, e;
  68.  
  69. A[0][0] = alfa / h;
  70. A[1][0] = beta - alfa / h;
  71. b[0] = -gamma;
  72.  
  73. for (int j = 1; j < i - 1; j++) {
  74. A[0][j] = (P / h / h) + (Q / 2.0 / h);
  75. A[1][j] = R - (2.0 * P / h / h);
  76. A[2][j - 1] = (P / h / h) - (Q / 2.0 / h);
  77. x_i += h;
  78. b[j] = -s(x_i);
  79. }
  80.  
  81. A[1][i - 1] = fi / h + psi;
  82. A[2][i - 2] = -fi / h;
  83. b[i - 1] = -theta;
  84.  
  85. thomasAlgorithm(A, i);
  86. solution(A, b, x, i);
  87.  
  88. x_i = aLeft;
  89.  
  90. for (int j = 0; j < i; j++) {
  91. misscalc[j] = fabs(x[j] - analyticalSolution(x_i));
  92. x_i += h;
  93. }
  94. if (i == 100) {
  95. saveData(x, h, i, "conventional.txt");
  96. }
  97. e = getEstimator(misscalc, i);
  98.  
  99. delete[] x;
  100. delete[] b;
  101. delete[] misscalc;
  102. for (int j = 0; j < 3; j++) {
  103. delete[] A[j];
  104. }
  105. delete[] A;
  106.  
  107. return e;
  108. }
  109.  
  110. double Numerow(double h, int i) {
  111. double** A = new double* [3];
  112. A[0] = new double[i - 1]; //upper
  113. A[1] = new double[i]; //diagonal
  114. A[2] = new double[i - 1]; //lower
  115. double* b = new double[i];
  116. double* misscalc = new double[i];
  117. double* x = new double[i];
  118. double x_i = aLeft, e;
  119.  
  120. A[0][0] = alfa / h;
  121. A[1][0] = beta - alfa / h;
  122. b[0] = -gamma;
  123.  
  124. for (int j = 1; j < i - 1; j++) {
  125. A[0][j] = (P / (h * h)) + (R / 12.0);
  126. A[1][j] = (R * 10.0 / 12.0) - (2.0 * P / (h * h));
  127. A[2][j - 1] = (P / (h * h)) + (R / 12.0);
  128. x_i += h;
  129. b[j] = -(s(x_i - h) / 12.0 + (10.0 / 12.0) * s(x_i) + s(x_i + h) / 12.0);
  130. }
  131.  
  132. A[1][i - 1] = fi / h + psi;
  133. A[2][i - 2] = -fi / h;
  134. b[i - 1] = -theta;
  135.  
  136. thomasAlgorithm(A, i);
  137. solution(A, b, x, i);
  138.  
  139. x_i = aLeft;
  140. for (int j = 0; j < i; j++) {
  141. misscalc[j] = fabs(x[j] - analyticalSolution(x_i));
  142. x_i += h;
  143. }
  144.  
  145. if (i == 100) {
  146. saveData(x, h, i, "Numerow.txt");
  147. }
  148. e = getEstimator(misscalc, i);
  149.  
  150. delete[] x;
  151. delete[] b;
  152. delete[] misscalc;
  153. for (int j = 0; j < 3; j++) {
  154. delete[] A[j];
  155. }
  156. delete[] A;
  157.  
  158. return e;
  159. }
  160.  
  161. int main()
  162. {
  163. double h;
  164. fstream misscal;
  165. misscal.open("misscalculations.txt", ios::out);
  166. misscal.precision(15);
  167. h = (bRight - aLeft) / 9.0;
  168. misscal << log10(h) << " " << log10(conventional(h, 10)) << " " << log10(Numerow(h, 10)) << endl;
  169. for (int i = 100; i < 100000; i += 100) {
  170. h = (bRight - aLeft) / (i - 1);
  171. misscal << log10(h) << " " << log10(conventional(h, i)) << " " << log10(Numerow(h, i)) << endl;
  172. }
  173. misscal.close();
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement