Advertisement
Luxray-SHOTN

c++ code

Aug 6th, 2013
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.67 KB | None | 0 0
  1. //C++ code for calculating the motion of a double pendulum.
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cmath>
  5. using namespace std;
  6.  
  7. // function prototypes here
  8. double thetaup(double&, double);
  9. double thetalo(double&, double);
  10. double omegaup(double&, double);
  11. double omegalo(double, double&, double);
  12.  
  13. //variables
  14. double period = (2), periodmax = 10, r = 1.0, g = 1.0, anought = 0.0, t = 0.0, dt = 0.1, tmax = 100;
  15. double p = ((g/r)*dt); //variables.. could tweak for user input
  16. double nmax = ((tmax/dt));
  17.  
  18.  
  19. //starting main
  20. int main()
  21. {
  22. double thetaupvar = 0.1, thetalovar = 0.0, omegaupvar = 0.0, omegalovar = 0.0;
  23. ofstream results("results.txt"); //set up file output and below setting up column headings
  24. ofstream chaosgraph("graph.txt");
  25. results << "Time t \t" << "theta (upper) \t" << "omega (upper) \t" << "theta (lower) \t" << "omega (lower)" << endl;
  26. chaosgraph << "Period \t anought" << endl;
  27.  
  28. for(int z=0; z<1300000; z++) // For 200 period 'lines' times 200 anought 'lines'
  29. {
  30.  
  31. for(int n =0; n <=nmax; n++) // loop here, for t to 100
  32. {
  33. t += dt; // add to t, then do functions that that value of t
  34. //results << t << "\t" << thetaup(thetaupvar, omegaupvar) << "\t" << omegaup(omegaupvar, thetaupvar) << "\t" << thetalo(thetalovar, omegalovar) << "\t" << omegalo(t, omegalovar, thetalovar) << endl;
  35. thetaup(thetaupvar, omegaupvar);
  36. omegaup(omegaupvar, thetaupvar); // commented out above to speed up code;
  37. thetalo(thetalovar, omegalovar); // calling functions here
  38. omegalo(t, omegalovar, thetalovar);
  39. }
  40.  
  41. if(thetalovar<0) // CHECK: is theta negative?
  42. {
  43. chaosgraph << period << "\t" << anought << endl; //yes - so plot, then reset parameters for next run;
  44. thetaupvar = 0.1, thetalovar = 0.0, omegaupvar = 0.0, omegalovar = 0.0, t = 0.0;
  45. }
  46. else //no - so just reset the parameters.
  47. {
  48. thetaupvar = 0.1, thetalovar = 0.0, omegaupvar = 0.0, omegalovar = 0.0, t = 0.0;
  49. }
  50.  
  51. if(period>=periodmax) // CHECK: is the period at the end of a line?
  52. {
  53. anought += 0.0002; // yes - reset the period and increment anought
  54. period = 2;
  55. }
  56. else // no - keep going with the line
  57. {
  58. period += 0.005;
  59. }
  60.  
  61. if(anought>=0.25 && period>=periodmax) // quit when top right corner
  62. {
  63. exit(99);
  64. }
  65.  
  66. }
  67. return 0;
  68.  
  69.  
  70. }
  71.  
  72. // begin called functions
  73. double thetaup(double& thetaupvar, double omegaupvar) // displacement of upper bob
  74. {
  75. thetaupvar += omegaupvar * dt;
  76. return thetaupvar;
  77. }
  78.  
  79. double omegaup(double& omegaupvar, double thetaupvar) // angular velocity of upper bob
  80. {
  81. omegaupvar -= p * sin(thetaupvar);
  82. return omegaupvar;
  83. }
  84.  
  85. double thetalo(double& thetalovar, double omegalovar) // displacement of lower bob
  86. {
  87. thetalovar += omegalovar * dt;
  88. return thetalovar;
  89. }
  90.  
  91. double omegalo(double t, double& omegalovar, double thetalovar) // angular velocity of lower bob (works out angular acceleration inside function)
  92. {
  93. double x;
  94. x = (((2*3.1415926)*t)/(period)); // x is what sin processes below = 2 pi time t over period
  95. double a;
  96. a = anought * sin(x); // a is angular acceleration is worked here
  97. omegalovar -= ((1/r)*((g*sin(thetalovar)) + (a*cos(thetalovar))))*dt; // new value for omega (lower)
  98. return omegalovar;
  99. }
  100.  
  101.  
  102. //end
  103.  
  104. //have a cookie, code
  105.  
  106.  
  107. Now energy
  108.  
  109. //C++ code for calculating the motion of a double pendulum.
  110. #include <iostream>
  111. #include <fstream>
  112. #include <cmath>
  113. using namespace std;
  114.  
  115. // function prototypes here
  116. double thetaup(double&, double);
  117. double thetalo(double&, double);
  118. double omegaup(double&, double);
  119. double omegalo(double, double&, double);
  120. double kenergy(double&, double, double, double, double);
  121. double penergy(double&, double, double);
  122. double tenergy(double&, double, double);
  123.  
  124. //variables
  125. double period = (7), periodmax = 9, r = 1.0, g = 1.0, anought = 0.21, t = 0.0, dt = 0.1, tmax = 100;
  126. //taking relative masses mass upper = 20, mass lower = 1.
  127. double p = ((g/r)*dt); //variables.. could tweak for user input
  128. double nmax = ((tmax/dt));
  129.  
  130.  
  131. //starting main
  132. int main()
  133. {
  134. double thetaupvar = 0.1, thetalovar = 0.0, omegaupvar = 0.0, omegalovar = 0.0;
  135. double kinetic = 0.0, potential = 0.0, total = 0.0;
  136. ofstream results("results.txt"); //set up file output and below setting up column headings
  137. ofstream extend("energies.txt");
  138. ofstream test("this is only a test.txt");
  139. results << "Time t \t" << "theta (upper) \t" << "omega (upper) \t" << "theta (lower) \t" << "omega (lower)" << endl;
  140. extend << "Kinetic \t Potential \t Total" << endl;
  141. test << "time t \t potential" << endl;
  142.  
  143.  
  144. for(int n =0; n <=nmax; n++) // loop here, for t to 100
  145. {
  146. t += dt; // add to t, then do functions that that value of t
  147. thetaup(thetaupvar, omegaupvar);
  148. omegaup(omegaupvar, thetaupvar);
  149. thetalo(thetalovar, omegalovar); // calling functions here
  150. omegalo(t, omegalovar, thetalovar);
  151. extend << kenergy(kinetic, omegaupvar, omegalovar, thetaupvar, thetalovar) << "\t" << penergy(potential, thetaupvar, thetalovar) << "\t" << tenergy(total, kinetic, potential) << endl;
  152. test << t << "\t" << penergy(potential, thetaupvar, thetalovar) << endl;
  153. }
  154.  
  155. return 0;
  156.  
  157.  
  158. }
  159.  
  160. // begin called functions
  161. double thetaup(double& thetaupvar, double omegaupvar) // displacement of upper bob
  162. {
  163. thetaupvar += omegaupvar * dt;
  164. return thetaupvar;
  165. }
  166.  
  167. double omegaup(double& omegaupvar, double thetaupvar) // angular velocity of upper bob
  168. {
  169. omegaupvar -= p * sin(thetaupvar);
  170. return omegaupvar;
  171. }
  172.  
  173. double thetalo(double& thetalovar, double omegalovar) // displacement of lower bob
  174. {
  175. thetalovar += omegalovar * dt;
  176. return thetalovar;
  177. }
  178.  
  179. double omegalo(double t, double& omegalovar, double thetalovar) // angular velocity of lower bob (works out angular acceleration inside function)
  180. {
  181. double x;
  182. x = (((2*3.1415926)*t)/(period)); // x is what sin processes below = 2 pi time t over period
  183. double a;
  184. a = anought * sin(x); // a is angular acceleration is worked here
  185. omegalovar -= ((1/r)*((g*sin(thetalovar)) + (a*cos(thetalovar))))*dt; // new value for omega (lower)
  186. return omegalovar;
  187. }
  188.  
  189. double kenergy(double& kinetic, double omegaupvar, double omegalovar, double thetaupvar, double thetalovar)
  190. {
  191. kinetic = (((10.5)*(omegaupvar)*(omegaupvar))+((0.5)*(omegalovar)*(omegalovar))+((omegaupvar)*(omegalovar)*cos((thetaupvar)-(thetalovar))));
  192. return kinetic;
  193. }
  194.  
  195. double penergy(double& potential, double thetaupvar, double thetalovar)
  196. {
  197. potential = (((21)*(1-cos(thetaupvar)))-(1-cos(thetalovar)));
  198. return potential;
  199. }
  200.  
  201. double tenergy(double& total, double kinetic, double potential)
  202. {
  203. total = ((kinetic) + (potential));
  204. return total;
  205. }
  206.  
  207.  
  208. //end
  209.  
  210. //have a cookie, code
  211.  
  212. //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement