Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3.  
  4. using namespace std;
  5.  
  6. const double gamma = 0;
  7. const double w0 = 10;
  8. const double A = 3.1;
  9. const double h = 0.01;
  10. const int N = 1025;
  11.  
  12. struct point {
  13. double x;
  14. double y;
  15. };
  16.  
  17. point F(point& v) {
  18. point ans;
  19.  
  20. ans.x = v.y;
  21. ans.y = -2 * gamma * v.y - w0 * w0 * sin(v.x);
  22.  
  23. return ans;
  24. }
  25.  
  26. double linear(double t) {
  27. return A * exp(-gamma * t) * cos(sqrt(w0 * w0 - gamma * gamma) * t);
  28. }
  29.  
  30. void FFTAnalysis(double AVal[], double FTvl[]) {
  31. int n = (N - 1) * 2, m = 0;
  32.  
  33. double Tmvl[2 * N];
  34.  
  35. for (int i = 0; i < n; i += 2) {
  36. Tmvl[i] = 0;
  37. Tmvl[i + 1] = AVal[i / 2];
  38. }
  39.  
  40. for (int i = 1, j = 1; i < n; i += 2, j += m) {
  41. if (j > i) {
  42. swap(Tmvl[i] , Tmvl[j]);
  43. swap(Tmvl[i + 1], Tmvl[j + 1]);
  44. }
  45.  
  46. m = (N - 1);
  47. while ((m >= 2) && (j > m)) {
  48. j -= m;
  49. m /= 2;
  50. }
  51. }
  52.  
  53. for (int Mmax = 2; Mmax < n; Mmax *= 2) {
  54. double Theta = -M_PI * 2 / Mmax;
  55. double Wpr = sin(Theta / 2) * sin(Theta / 2) * 2;
  56. double Wr = 1, Wi = 0; m = 1;
  57.  
  58. while (m < Mmax) {
  59. m = m + 2;
  60. double Tmpr = Wr, Tmpi = Wi;
  61. Wr -= Tmpr * Wpr + Tmpi * sin(Theta);
  62. Wi += Tmpr * sin(Theta) - Tmpi * Wpr;
  63.  
  64. for (int i = m - 2; i < n; i += Mmax * 2) {
  65. int temp = i + Mmax;
  66. Tmpr = Wr * Tmvl[temp] - Wi * Tmvl[temp - 1];
  67. Tmpi = Wi * Tmvl[temp] + Wr * Tmvl[temp - 1];
  68.  
  69. Tmvl[temp] = Tmvl[i] - Tmpr; Tmvl[temp - 1] = Tmvl[i - 1] - Tmpi;
  70. Tmvl[i] = Tmvl[i] + Tmpr; Tmvl[i - 1] = Tmvl[i - 1] + Tmpi;
  71. }
  72. }
  73. }
  74.  
  75. for (int i = 0; i < (N - 1); i++) {
  76. FTvl[i] = 2 * sqrt(pow(Tmvl[i * 2], 2) + pow(Tmvl[i * 2 + 1], 2)) / (N - 1);
  77. }
  78. }
  79.  
  80. int main() {
  81. point V[N];
  82.  
  83. V[0].x = A;
  84. V[0].y = 0;
  85.  
  86. point k1, k2, k3, k4;
  87. for (int i = 0; i < N - 1; i++) {
  88. point temp;
  89.  
  90. k1 = F(V[i]);
  91.  
  92. temp.x = V[i].x + (h / 2) * k1.x;
  93. temp.y = V[i].y + (h / 2) * k1.y;
  94.  
  95. k2 = F(temp);
  96.  
  97. temp.x = V[i].x + (h / 2) * k2.x;
  98. temp.y = V[i].y + (h / 2) * k2.y;
  99.  
  100. k3 = F(temp);
  101.  
  102. temp.x = V[i].x + h * k3.x;
  103. temp.y = V[i].y + h * k3.y;
  104.  
  105. k4 = F(temp);
  106.  
  107. V[i + 1].x = V[i].x + h / 6 * (k1.x + 2 * k2.x + 2 * k3.x + k4.x);
  108. V[i + 1].y = V[i].y + h / 6 * (k1.y + 2 * k2.y + 2 * k3.y + k4.y);
  109. }
  110.  
  111. double coords[N - 1], FFTans[N - 1];
  112.  
  113. for (int i = 0; i < N - 1; i++) {
  114. coords[i] = V[i].x;
  115. FFTans[i] = 0;
  116. }
  117.  
  118. FFTAnalysis(coords, FFTans);
  119.  
  120. for (int i = 0; i < N - 1; i++) {
  121. cout << V[i].x << " " << linear(h * i) << " " << FFTans[i] << " " << h * i << '\n';
  122. }
  123.  
  124. return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement