Advertisement
Guest User

Untitled

a guest
May 24th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. #include <cmath>
  5. #include <fenv.h>
  6. #include <stdio.h>
  7.  
  8.  
  9. using namespace std;
  10.  
  11. double getf(double x, double t) {
  12. return -1;//3 * t * t - 6 * x;
  13. }
  14.  
  15. double phi(double x) {
  16. return x*x;//x * x * x;
  17. }
  18.  
  19. double alpha(double t) {
  20. return t;//t * t * t;
  21. }
  22.  
  23. double betta(double t) {
  24. return 1+t;//1 + t * t * t;
  25. }
  26.  
  27. double geta(double x, double t) {
  28. return 1;
  29. }
  30.  
  31. double getb(double x, double t) {
  32. return 0;
  33. }
  34.  
  35. double getc(double x, double t) {
  36. return 0;
  37. }
  38.  
  39. int N = 100;
  40. int M = 100;
  41. const long double T = 0.1;
  42. double h = 1. / (N + 0.);
  43. double tau = T / (M + 0.);
  44.  
  45. vector < double > x;
  46. vector < double > t;
  47.  
  48.  
  49. double ret[1000][1000];
  50.  
  51.  
  52. double L(int i, int k) {
  53. return geta(x[i], t[k]) * (ret[i + 1][k] - 2 * ret[i][k] + ret[i - 1][k]) / (h * h) +
  54. getb(x[i], t[k]) * (ret[i + 1][k] - ret[i - 1][k]) / (2 * h) +
  55. getc(x[i], t[k]) * ret[i][k];
  56. }
  57.  
  58.  
  59. struct Val{
  60. int n, m;
  61. map < pair < double, double>, double > a;
  62. Val(int n = 0, int m = 0): n(n), m(m) {
  63. }
  64.  
  65. void print() {
  66. for (auto tmp : a) {
  67. cout << tmp.first.first << " " << tmp.first.second << " " << tmp.second << endl;
  68. }
  69. }
  70.  
  71. double operator()(double x, double t) {
  72. pair < double, double> mP;
  73. mP.first = x;
  74. mP.second = t;
  75. return a[mP];
  76. }
  77.  
  78. void set_(int i, int j, double val) {
  79. pair < double, double> mP;
  80. mP.first = x[i];
  81. mP.second = t[j];
  82. a[mP] = val;
  83. }
  84.  
  85. };
  86.  
  87. Val naive_dif_scheme() {
  88. x.clear();
  89. t.clear();
  90. h = 1. / (N + 0.);
  91. tau = (double)T / (M + 0.);
  92. if ((tau / (h * h)) > (1.0 / 2.0)) {
  93. cout << "WARNING --- Система не устойчива\n";
  94. }
  95. for (int i = 0; i <= N; i++) {
  96. x.push_back(i * h);
  97. }
  98.  
  99. for (int k = 0; k <= M; k++) {
  100. t.push_back(tau * k);
  101. }
  102.  
  103. for (int i = 0; i <= N; i++) {
  104. ret[i][0] = phi(x[i]);
  105. }
  106. for (int k = 1; k <= M; k++) {
  107. ret[0][k] = alpha(t[k]);
  108. for (int i = 1; i <= N - 1; i++) {
  109. ret[i][k] = ret[i][k - 1] + tau * (L(i, k - 1) + getf(x[i], t[k - 1]));
  110. }
  111. ret[N][k] = betta(t[k]);
  112. }
  113. Val retq(N, M);
  114. for (int i = 0; i <= N; i++)
  115. for (int j = 0; j <= M; j++)
  116. retq.set_(i, j, ret[i][j]);
  117. return retq;
  118. }
  119.  
  120. template <typename Q, typename U>
  121. double getNorm(Q a, U b, int n, int m) {
  122. double ret = 0;
  123. double h = 1./ (n + 0.);
  124. double tau = T / (m + 0.);
  125. for (int i = 0; i < n ; i++) {
  126. for (int j = 0; j < m ; j++) {
  127. ret = max(ret, fabs(a(i * h, j * tau) - b(i * h, j * tau)));
  128. // if (ret == 0)
  129. // cout << i << " " << j << " " << a(i * h, j * tau) << " " << b(i * h, j * tau) << endl;
  130. }
  131. }
  132. return ret;
  133. };
  134.  
  135. struct neededAnswer {
  136. double operator()(double x, double t) {
  137. return x*x+t;//x * x * x + t * t * t;
  138. }
  139. };
  140.  
  141.  
  142.  
  143. Val with_weight(double w) {
  144. x.clear();
  145. t.clear();
  146. h = 1. / (N + 0.);
  147. tau = (double)T / (M + 0.);
  148. if ((tau / (h * h)) > (1.0 / 2.0)) {
  149. cout << "WARNING --- Система не устойчива\n";
  150. }
  151. for (int i = 0; i <= N; i++) {
  152. x.push_back(i * h);
  153. }
  154.  
  155. for (int k = 0; k <= M; k++) {
  156. t.push_back(tau * k);
  157. }
  158.  
  159. for (int i = 0; i <= N; i++) {
  160. ret[i][0] = phi(x[i]);
  161. }
  162. double G[N+1];
  163. for (int k = 1; k <= M; k++) {
  164. G[0] = alpha(t[k]);
  165. G[N] = betta(t[k]);
  166. for (int i = 1; i <= N - 1; i++) {
  167. G[i] = -1 / tau * ret[i][k - 1] - (1 - w) * L(i, k - 1) - getf(x[i], t[k - 1]);
  168. }
  169. ret[0][k] = alpha(t[k]);
  170. double A[N + 1], B[N + 1], C[N + 1];
  171.  
  172. A[0] = 0;
  173. B[0] = -1;
  174. C[0] = 0;
  175. C[N] = 0;
  176. A[N] = -1. / h;
  177.  
  178. B[N] = A[N];
  179. for (int i = 1; i <= N - 1; i++) {
  180. A[i] = w * (1 / h / h - 1 / (2 * h));
  181. B[i] = w * 2 / h / h + 1. / tau;
  182. C[i] = w * (1 / h / h + 1 / (2 * h));
  183. }
  184. double T[N+1], S[N+1];
  185. S[0] = C[0] / B[0];
  186. T[0] = -G[0] / B[0];
  187. for (int i = 1; i <= N; ++i) {
  188. S[i] = C[i] / (B[i] - A[i] * S[i - 1]);
  189. T[i] = (A[i] * T[i - 1] - G[i]) / (B[i] - A[i] * S[i - 1]);
  190.  
  191. }
  192. double Y[N+1];
  193. Y[N] = T[N];
  194. for (int i = N - 1; i >= 0; --i) {
  195. Y[i] = S[i] * Y[i + 1] + T[i];
  196.  
  197. }
  198. for (int i = 1; i <= N - 1; i++) {
  199. ret[i][k] = Y[i];
  200.  
  201.  
  202. }
  203. ret[N][k] = betta(t[k]);
  204. }
  205. Val retq(N, M);
  206. for (int i = 0; i <= N; i++)
  207. for (int j = 0; j <= M; j++) {
  208. retq.set_(i, j, ret[i][j]);
  209.  
  210.  
  211. }
  212. return retq;
  213. }
  214.  
  215. int main() {
  216. neededAnswer answer;
  217. for (int n = 5; n <= 40; n *= 2) {
  218. if (n == 40)
  219. n=30;
  220. N = n;
  221. M = n * n;
  222. Val tmp = naive_dif_scheme();
  223. cout << "N = " << N << " M = " << M << " ";
  224. cout << " разница = " << getNorm(answer, tmp, N, M) << endl;
  225. }
  226.  
  227. double sigma = 0.0;
  228. while (sigma < 1) {
  229. cout << "вес = " << sigma << endl;
  230. for (int n = 5 ; n <= 40; n *= 2) {
  231. if (n == 40)
  232. n=30;
  233. N = n;
  234. M = n * n;
  235. Val tmp = with_weight(sigma);
  236. cout << "N = " << N << " M = " << M << " ";
  237. cout << " разница = " << getNorm(answer, tmp, N, M) << endl;
  238. }
  239. sigma += 0.1;
  240. }
  241. return 0;
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement