Advertisement
Guest User

Untitled

a guest
May 20th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.37 KB | None | 0 0
  1. // MO9.cpp : Ten plik zawiera funkcję „main”. W nim rozpoczyna się i kończy wykonywanie programu.
  2. //
  3.  
  4. #include <cmath>
  5. #include "pch.h"
  6. #include <iostream>
  7. #include "Calc.h"
  8. #include <fstream>
  9. #define M_PI 3.1415926535897932384626433
  10.  
  11. double U(double x) { return 1.0 / 4.0 * (2 * x * cos(2 * x) + 2 * sin(2 * x) - log(2)*sin(2 * x) - 2 * log(cos(x))*sin(2 * x)); }
  12. double p(double x) { return 1.; };
  13. double q(double x) { return 0.; };
  14. double r(double x) { return 4.; };
  15. double s(double x) { return tan(x); };
  16. double error(double x, double y) { return fabs(x - y); }
  17.  
  18. int main()
  19. {
  20.  
  21. double alfa = 0., fi = 0., beta = 1., psi = 1., gamma = 0., theta = 0.;
  22. int N = 10;
  23.  
  24. std::vector<double> er_nor;
  25. std::vector<double> er_num;
  26. std::vector<double> h_v;
  27. std::vector<double> l;
  28. l.resize(N);
  29. auto d = l; auto u = l; auto b = l;
  30.  
  31. double _a = 0;
  32. double _b = M_PI / 4;
  33. double h = 1e-14;
  34. double max_er;
  35. std::cout << h << std::endl;
  36.  
  37. std::shared_ptr<Calc> calc = std::make_shared<Calc>(N);
  38.  
  39. while (h < 0.15) {
  40. //metoda konwencjonalna
  41. d[0] = beta - alfa / h;
  42. u[0] = alfa / h;
  43. b[0] = -gamma;
  44. l[0] = p(_a) / (h*h) - q(_a) / (2.*h);
  45.  
  46. double xi = _a;
  47. for (int k = 1; k < N-1 && xi < _b; k++) {
  48. xi += h;
  49. l[k] = p(xi) / (h*h) - q(xi) / (2.*h);
  50. d[k] = (-2.*p(xi)) / (h*h) + r(xi);
  51. u[k] = p(xi) / (h*h) + q(xi) / (2.*h);
  52. b[k] = -s(xi);
  53.  
  54. }
  55. l[N - 1] = (-fi / h);
  56. d[N - 1] = (-fi / h + psi);
  57. b[N - 1] = (-theta);
  58.  
  59. auto output = calc->solve_t(l, d, u, b);
  60.  
  61. xi = _a;
  62. max_er = 0;
  63.  
  64. for (int i = 0; i < N; i++) {
  65. double temp = error(output[i], U(xi));
  66. if (temp > max_er)
  67. max_er = temp;
  68. xi += h;
  69.  
  70. }
  71.  
  72. er_nor.push_back(max_er);
  73.  
  74. max_er = 0;
  75.  
  76. //metoda Numerowa
  77. xi = _a;
  78. d[0] = beta - alfa / h;
  79. u[0] = alfa / h;
  80. b[0] = -gamma;
  81. l[0] = p(_a) / (h*h) + 1. / 12.;
  82. for (int k = 1; k < N - 1; ++k) {
  83. xi += h;
  84. l[k] = p(xi) / (h*h) + 1. / 12.;
  85. d[k] = (-2.*p(xi)) / (h*h) + r(xi) * 10. / 12.;
  86. u[k] = p(xi) / (h*h) + 1. / 12.;
  87. b[k] = -(s(xi - h) + 10.*s(xi) + s(xi + h)) / 12.;
  88. }
  89. l[N - 1] = (-fi / h);
  90. d[N - 1] = (-fi / h + psi);
  91. b[N - 1] = (-theta);
  92.  
  93. auto output1 = calc->solve_t(l, d, u, b);
  94.  
  95. for (int i = 0; i < N; i++) {
  96. double temp = error(output1[i], U(xi));
  97. if (temp > max_er)
  98. max_er = temp;
  99. xi += h;
  100.  
  101. }
  102.  
  103. h_v.push_back(h);
  104. er_num.push_back(max_er);
  105. h += 5e-5;
  106. }
  107.  
  108. /*
  109. d[0] = 30.0; u[0] = 2.0 / 3.0;
  110. l[0] = 3.0 / 4.0; d[1] = 20.0; u[1] = 5.0 / 6.0;
  111. l[1] = 7.0 / 8.0; d[2] = 10.0; u[2] = 9.0 / 10.0;
  112. l[2] = 11.0 / 12.0; d[3] = 10.0; u[3] = 13.0 / 14.0;
  113. l[3] = 15.0 / 16.0; d[4] = 20.0; u[4] = 17.0 / 18.0;
  114. l[4] = 19.0 / 20.0; d[5] = 30.0;
  115. b[0] = 94.0 / 3.0; b[1] = 173.0 / 4.0; b[2] = 581.0 / 20.0;
  116. b[3] = -815.0 / 28.0; b[4] = -6301.0 / 144.0; b[5] = -319.0 / 10.0;
  117. */
  118. std::fstream file;
  119. file.open("data.csv", std::ios::out);
  120. if (file.good()) std::cout << "Plik otwary\n";
  121. file << "h;er_norm;er_numerov\n";
  122. for (int i = 0; i < h_v.size(); i++) {
  123. //printf("%5.5lf %5.5lf\n", h_v[i], er[i]);
  124. file << std::fixed << std::setprecision(10) << (h_v[i]) << ";" << (er_nor[i]) << ";" << er_num[i] << std::endl;
  125. }
  126.  
  127. }
  128.  
  129.  
  130.  
  131. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  132. #pragma once
  133. #include <vector>
  134. #include <iostream>
  135. #include <iomanip>
  136. class Calc
  137. {
  138. int dim;
  139.  
  140. public:
  141. Calc(int _dim) :dim(_dim) {};
  142. ~Calc();
  143. void solve_thomas(std::vector<std::vector<double>>, std::vector<double>);
  144.  
  145. std::vector<double> solve_t(std::vector<double>, std::vector<double>, std::vector<double>, std::vector<double>);
  146. };
  147.  
  148. /////////////////////////////////////////////////////////////////////////
  149.  
  150.  
  151. std::vector<double> Calc::solve_t(std::vector<double> l, std::vector<double> d, std::vector<double> u, std::vector<double> b)
  152. {
  153. std::vector<double> ni;
  154. ni.resize(dim);
  155. ni[0] = d[0];
  156. for (int i = 1; i < dim; i++) {
  157. ni[i] = d[i] - l[i-1] * (1.0 / ni[i-1]) * u[i-1];
  158. d[i] = ni[i];
  159. }
  160. for (int i = 1; i < dim; i++) {
  161. b[i] = b[i] - l[i-1] * (1.0 / ni[i - 1])*b[i-1];
  162. }
  163.  
  164. std::vector<double> solVx; solVx.resize(dim);
  165. solVx[dim - 1] = 1.0 / ni[dim - 1] * b[dim - 1];
  166. for (int i = dim - 2; i >= 0; i--) {
  167. solVx[i] = (1.0 / ni[i])*(b[i] - u[i] * solVx[i + 1]);
  168.  
  169. }
  170. return solVx;
  171. }
  172. ////////////////
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement