Advertisement
evgeniya_polyntseva

kursovaya

Jun 1st, 2020
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.52 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <fstream>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <string>
  7. #include <conio.h>
  8. using namespace std;
  9.  
  10. vector<double> DL, D, DR;
  11. double hx;
  12.  
  13. double Func(double x)
  14. {
  15. return -12*x*x;
  16. }
  17.  
  18. double UFunc(double x)
  19. {
  20. return x*x*x*x;
  21. }
  22.  
  23. vector<vector<double>> LocalG(double L)
  24. {
  25. const double G1[2][2] = {
  26. { 1, -1},
  27. { -1, 1} };
  28. vector<vector<double>> G2;
  29. G2.resize(2);
  30. for (int i = 0; i < 2; i++)
  31. G2[i].resize(2);
  32. for (int i = 0; i < 2; i++)
  33. {
  34. for (int j = 0; j < 2; j++)
  35. {
  36. G2[i][j] = G1[i][j] * L / hx;
  37. }
  38. }
  39. return G2;
  40. }
  41.  
  42. void GlobalG(double L, const vector<double >& x)
  43. {
  44. int size = x.size();
  45. vector<vector<double>> G = LocalG(L);
  46. for (int i = 0; i < size - 1; i++)
  47. {
  48. D[i] += G[0][0];
  49. D[i + 1] += G[1][1];
  50. DL[i + 1] += G[0][1];
  51. DR[i] += G[1][0];
  52. }
  53. }
  54.  
  55. vector<double> Mult(vector<vector<double>>& m, vector<double>& v)
  56. {
  57. vector<double> out;
  58. out.resize(2);
  59. for (int i = 0; i < 2; i++)
  60. {
  61. out[i] = 0;
  62. for (int j = 0; j < 2; j++)
  63. out[i] += m[i][j] * v[j];
  64. }
  65. return out;
  66. }
  67.  
  68. vector<vector<double>> LocalM(double koef)
  69. {
  70. const double m[2][2] =
  71. {
  72. {2, 1 },
  73. {1, 2}
  74. };
  75. vector<vector<double>> M;
  76. M.resize(2);
  77. for (int i = 0, size = M.size(); i < size; ++i)
  78. M[i].resize(2);
  79. for (int i = 0; i < 2; i++)
  80. {
  81. for (int j = 0; j < 2; j++)
  82. {
  83. M[i][j] = koef * hx * m[i][j] / 6;
  84. }
  85. }
  86. return M;
  87. }
  88.  
  89. vector<double> GlobalF(double G, const vector<double >& x)
  90. {
  91. int countOfElements = (x.size() - 1);
  92. vector<double> F;
  93. F.resize(x.size());
  94. for (int k = 0; k < countOfElements; ++k)
  95. {
  96. vector<vector<double>> tmp = LocalM(G);
  97. vector<double> F1;
  98. F1.resize(2);
  99. F1[0] = Func(x[k]);
  100. F1[1] = Func(x[k + 1]);
  101. F1 = Mult(tmp, F1);
  102. F[k] += F1[0];
  103. F[k + 1] += F1[1];
  104. }
  105. return F;
  106. }
  107.  
  108. vector<double> Compute(int& size, vector<double>& s)
  109. {
  110. vector<double> U;
  111. U.resize(size);
  112. for (int i = 0; i < size - 1; i++)
  113. {
  114. if (D[i] != 0)
  115. {
  116. double K1 = -DL[i + 1] / D[i];
  117. DL[i + 1] = 0;
  118. D[i + 1] += K1 * DR[i];
  119. s[i + 1] += K1 * s[i];
  120. }
  121. }
  122. U[size - 1] = s[size - 1] / D[size - 1];
  123. for (int i = size - 2; i > -1; i--)
  124. {
  125. U[i] = (s[i] - DR[i] * U[i + 1]) / D[i];
  126. }
  127. return U;
  128. }
  129.  
  130. void FBC(int size, vector<double>& v, double kraev1, double kraev2)
  131. {
  132. D[0] = 1;
  133. DR[0] = 0;
  134. v[0] = kraev1;
  135. D[size - 1] = 1;
  136. DL[size - 1] = 0;
  137. v[size - 1] = kraev2;
  138. }
  139.  
  140. int main()
  141. {
  142. setlocale(LC_ALL, "Russian");
  143. double L = 0, G = 0, kraev1 = 0, kraev2 = 0;
  144. FILE* fin;
  145. fin = fopen("lyambda.txt", "r");
  146. fscanf(fin, "%lf", &L);
  147. fin = fopen("gamma.txt", "r");
  148. fscanf(fin, "%lf", &G);
  149. int kol_el = 0;
  150. double tmp = 0, tmp1 = 0;
  151. int tmp2 = 0;
  152. vector<double> x;
  153. fin = fopen("x.txt", "r");
  154. fscanf(fin, "%lf", &tmp);
  155. fscanf(fin, "%lf", &tmp1);
  156. fscanf(fin, "%d", &tmp2);
  157. fclose(fin);
  158. hx = (tmp1 - tmp) / tmp2;
  159. for (int i = 0; i <= tmp2; i++) x.emplace_back(tmp + i * hx);
  160. kraev1 = UFunc(x[0]);
  161. kraev2 = UFunc(x[tmp2]);
  162. int size = x.size();
  163. DL.resize(size);
  164. D.resize(size);
  165. DR.resize(size);
  166. GlobalG(L, x);
  167. vector<double> F = GlobalF(G, x);
  168. FBC(size, F, kraev1, kraev2);
  169. vector<double> u = Compute(size, F);
  170. FILE* fout;
  171. fout = fopen("U.txt", "w");
  172. fprintf(fout, "x u u* |u-u*| |u-u*/u*| \n");
  173. for (int i = 0; i < size; i++)
  174. {
  175. fprintf(fout, "%lf %lf %lf %lf %lf \n", x[i], u[i], UFunc(x[i]), abs(u[i] - UFunc(x[i])), abs((u[i] - UFunc(x[i])) / UFunc(x[i])));
  176. }
  177. return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement