Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <fstream>
  4.  
  5.  
  6.  
  7. using namespace std;
  8.  
  9. const float g = 10;
  10. const float l = 50;
  11. const float gamma = 0.1 ;
  12. const float omegad=10;
  13. const float A=0;
  14.  
  15. struct state
  16. {
  17. float theta;
  18. float epsilon;
  19. };
  20.  
  21. struct derivative
  22. {
  23. float dtheta;
  24. float depsilon;
  25.  
  26. derivative& operator*(float& num)
  27. {
  28. dtheta *= num;
  29. depsilon *= num;
  30. return *this;
  31. }
  32. };
  33.  
  34. derivative evaluate(state actual, float t, float h, derivative d)
  35. {
  36. state s;
  37. derivative out;
  38.  
  39. s.theta = actual.theta + d.dtheta*h;
  40. s.epsilon = actual.epsilon + d.depsilon*h;
  41.  
  42. out.dtheta = s.epsilon;
  43. out.depsilon = A*cos(omegad*t)-gamma * s.epsilon-g/l*sin(s.theta);
  44.  
  45. return out;
  46. }
  47.  
  48. state rk4(state s, float t, float h)
  49. {
  50. derivative d0;
  51. float delta_theta, delta_epsilon;
  52.  
  53. d0.depsilon = 0;
  54. d0.dtheta = 0;
  55.  
  56. derivative k1 = evaluate(s, t, 0, d0);
  57. derivative k2 = evaluate(s, t, h*0.5f, k1*0.5);
  58. derivative k3 = evaluate(s, t, h*0.5f, k2*0.5);
  59. derivative k4 = evaluate(s, t, h, k3);
  60.  
  61. delta_theta = 1.0f/6.0f * h * (k1.dtheta + 2.0f*k2.dtheta + 2.0f*k3.dtheta + k4.dtheta);
  62. delta_epsilon = 1.0f/6.0f * h * (k1.depsilon + 2.0f*k2.depsilon + 2.0f*k3.depsilon + k4.depsilon);
  63.  
  64. s.theta = s.theta + delta_theta;
  65. s.epsilon = s.epsilon + delta_epsilon;
  66.  
  67. return s;
  68. }
  69.  
  70. int main()
  71. {
  72. fstream zapis;
  73. zapis.open("zapis.txt",ios::out);
  74. float t = 0;
  75. float h = 0.1f;
  76. state s;
  77.  
  78. s.theta = 15;
  79. s.epsilon = 0;
  80.  
  81. for(t=0; t<50; t+=h)
  82. {
  83. s = rk4(s, t, h);
  84. zapis<<t<<" "<<s.theta<<endl;
  85. }
  86. zapis.close();
  87. return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement