[关闭]
@ibilis 2016-11-13T13:51:10.000000Z 字数 4434 阅读 509

第八次作业

计算物理


正文

1.公式推导


2.代码

  1. from math import *
  2. from pylab import *
  3. # define a function that given amplitude of force, gives angle,avelo and t
  4. def change_amp(F):
  5. q = 0.5
  6. l = 9.8
  7. g = 9.8
  8. f = 2/3
  9. dt = pi/100
  10. theta0 = 0.2
  11. omega0 = 0
  12. angle = [theta0]
  13. avelo = [omega0]
  14. t = [0]
  15. an=[theta0]
  16. av=[omega0]
  17. # move the pendulum
  18. while t[-1] < 3000*pi:
  19. avelo_new = avelo[-1] - ((g/l)*sin(angle[-1]) + q*avelo[-1] - F*sin(f*t[-1]))*dt
  20. avelo.append(avelo_new)
  21. angle_new = angle[-1] + avelo[-1]*dt
  22. while angle_new > pi:
  23. angle_new -= 2*pi
  24. while angle_new < -pi:
  25. angle_new += 2*pi
  26. angle.append(angle_new)
  27. t_new = t[-1] + dt
  28. t.append(t_new)
  29. if t[-1]%(3*pi) <=dt:
  30. an.append(angle_new)
  31. av.append(avelo_new)
  32. return an,av
  33. ang = change_amp(1.2)[0]
  34. ave = change_amp(1.2)[1]
  35. scatter(ang,)
  36. title('angular velocity versus angle when F=1.2')
  37. xlabel('theta(radians)')
  38. ylabel('omega(radians/s)')
  39. grid(True)
  40. show()
  1. from math import *
  2. from pylab import *
  3. from numpy import *
  4. # define a function that given amplitude of force, gives angle,avelo and t
  5. def change_amp(F):
  6. # define some constants
  7. q = 0.5
  8. l = 9.8
  9. g = 9.8
  10. f = 2/3+0.00002
  11. dt = math.pi/100
  12. theta0 = 0.2
  13. omega0 = 0
  14. angle = [theta0]
  15. avelo = [omega0]
  16. t = [0]
  17. an=[]
  18. # move the pendulum
  19. while t[-1] <= 1200*pi:
  20. avelo_new = avelo[-1] - ((g/l)*sin(angle[-1]) + q*avelo[-1] - F*sin(f*t[-1]))*dt
  21. avelo.append(avelo_new)
  22. angle_new = angle[-1] + avelo[-1]*dt
  23. while angle_new > pi:
  24. angle_new -= 2*pi
  25. while angle_new < -pi:
  26. angle_new += 2*pi
  27. angle.append(angle_new)
  28. if t[-1]>=900*pi:
  29. if t[-1]%(3*pi)<=dt:
  30. an.append(angle_new)
  31. t_new = t[-1] + dt
  32. t.append(t_new)
  33. return an
  34. fd1=list(linspace(1.35,1.5,100))
  35. fd=[]
  36. th=[]
  37. for i in fd1:
  38. points=change_amp(i)
  39. for j in points:
  40. fd.append(i)
  41. th.append(j)
  42. scatter(fd,th,s=10)
  43. grid(True)
  44. xlim(1.35,1.5)
  45. ylim(0,3)
  46. title('Bifurcation diagram')
  47. xlabel('FD')
  48. ylabel('theta(radians)')
  49. show()
  1. """
  2. Created on Sat Nov 12 16:21:22 2016
  3. @author: dw
  4. """
  5. from __future__ import division
  6. from visual import *
  7. from math import *
  8. q=0.5
  9. l=9.8
  10. g=9.8
  11. f=2/3
  12. dt=0.04
  13. theta0=0.2
  14. omega0=0
  15. # add three ceilings
  16. ceil1=box(pos=(-20,5,0),size=(5,0.5,2),material=materials.bricks)
  17. ceil2=box(pos=(0,5,0),size=(5,0.5,2),material=materials.bricks)
  18. ceil3=box(pos=(20,5,0),size=(5,0.5,2),material=materials.bricks)
  19. ball1=sphere(pos=(-20+l*sin(theta0),5-l*cos(theta0),0),radius=1,material=materials.emissive,color=color.red)
  20. ball2=sphere(pos=(l*sin(theta0),5-l*cos(theta0),0),radius=1,material=materials.emissive,color=color.yellow)
  21. ball3=sphere(pos=(20+l*sin(theta0),5-l*cos(theta0),0),radius=1,material=materials.emissive,color=color.green)
  22. ball1.omega=omega0
  23. ball2.omega=omega0
  24. ball3.omega=omega0
  25. ball1.theta=theta0
  26. ball2.theta=theta0
  27. ball3.theta=theta0
  28. ball1.t=0
  29. ball2.t=0
  30. ball3.t=0
  31. ball1.F=0
  32. ball2.F=0.5
  33. ball3.F=1.2
  34. string1=curve(pos=[ceil1.pos,ball1.pos],color=color.red)
  35. string2=curve(pos=[ceil2.pos,ball2.pos],color=color.yellow)
  36. string3=curve(pos=[ceil3.pos,ball3.pos],color=color.green)
  37. po1=arrow(pos=ball1.pos,axis=(10*ball1.omega*cos(ball1.theta),10*ball1.omega*sin(ball1.theta),0),color=color.red)
  38. po2=arrow(pos=ball2.pos,axis=(10*ball2.omega*cos(ball2.theta),10*ball2.omega*sin(ball2.theta),0),color=color.yellow)
  39. po3=arrow(pos=ball3.pos,axis=(10*ball3.omega*cos(ball3.theta),10*ball3.omega*sin(ball3.theta),0),color=color.green)
  40. while True:
  41. rate(100)
  42. ball1.omega=ball1.omega-((g/l)*sin(ball1.theta)+q*ball1.omega-ball1.F*sin(f*ball1.t))*dt
  43. ball2.omega=ball2.omega-((g/l)*sin(ball2.theta)+q*ball2.omega-ball2.F*sin(f*ball2.t))*dt
  44. ball3.omega=ball3.omega-((g/l)*sin(ball3.theta)+q*ball3.omega-ball3.F*sin(f*ball3.t))*dt
  45. angle1_new=ball1.theta+ball1.omega*dt
  46. while angle1_new>pi:
  47. angle1_new-=2*pi
  48. while angle1_new<-pi:
  49. angle1_new+=2*pi
  50. angle2_new=ball2.theta+ball2.omega*dt
  51. while angle2_new>pi:
  52. angle2_new-=2*pi
  53. while angle2_new<-pi:
  54. angle2_new+=2*pi
  55. angle3_new=ball3.theta+ball3.omega*dt
  56. while angle3_new>pi:
  57. angle3_new-=2*pi
  58. while angle3_new<-pi:
  59. angle3_new+=2*pi
  60. ball1.theta=angle1_new
  61. ball2.theta=angle2_new
  62. ball3.theta=angle3_new
  63. ball1.pos=(-20+l*sin(ball1.theta),5-l*cos(ball1.theta),0)
  64. ball2.pos=(l*sin(ball2.theta),5-l*cos(ball2.theta),0)
  65. ball3.pos=(20+l*sin(ball3.theta),5-l*cos(ball3.theta),0)
  66. string1.pos=[ceil1.pos,ball1.pos]
  67. string2.pos=[ceil2.pos,ball2.pos]
  68. string3.pos=[ceil3.pos,ball3.pos]
  69. po1.pos=ball1.pos
  70. po2.pos=ball2.pos
  71. po3.pos=ball3.pos
  72. po1.axis=(10*ball1.omega*cos(ball1.theta),10*ball1.omega*sin(ball1.theta),0)
  73. po2.axis=(10*ball2.omega*cos(ball2.theta),10*ball2.omega*sin(ball2.theta),0)
  74. po3.axis=(10*ball3.omega*cos(ball3.theta),10*ball3.omega*sin(ball3.theta),0)
  75. ball1.t=ball1.t+dt
  76. ball2.t=ball2.t+dt
  77. ball3.t=ball3.t+dt

3结果

1.

20161113213750.png
20161113213739.png
20161113213724.png

2.

20161113213826.png
20161113213837.png
20161113213847.png

3.用Vpython画出动图

shiyan.gif

2结论

参数的微小改变,对混沌现象的产生有着较大的影响

3感谢吴雨桥同学的代码提供

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注