[关闭]
@zy-0815 2016-11-06T11:27:17.000000Z 字数 4287 阅读 1284

计算物理第七次作业

计算物理


摘要

本次作业就3.12 3.13 3.14题进行解答,即对单摆运动进行进一步的探讨,包括两个同时释放但初始角度有细微差别的单摆间角度的关系,以及角度和角速度之间的关系。

背景介绍

单摆作为物理学中一例经典的理想模型,我们在之前的学习中以及有了比较深刻的了解,这里我们通过计算机,将通过对其运动图像的分析和观察,从而对简谐振动有更进一步的理解和认识。

正文

1. 单摆和阻尼运动

首先,我们需要做基本的准备工作,即做出简谐摆的运动图像,为了尽可能考虑实际情况,我们还需要引入阻尼项和受迫振动项。

                          

由上面(1)(2)式,我们可以写出如下程序:

  1. import pylab as pl
  2. import math
  3. class Simple_Pendulum :
  4. def __init__(self,i=0,initial_theta=0.2,time_step=0.04,total_time=20,length=1,\
  5. g=9.8, initial_omega=0,q=1,Fd=0.2,omegaD=2):
  6. self.theta=[initial_theta]
  7. self.theta0=[initial_theta]
  8. self.t=[0]
  9. self.omega=[initial_omega]
  10. self.dt=time_step
  11. self.time=total_time
  12. self.g=g
  13. self.l=length
  14. self.q=q
  15. self.Fd=Fd
  16. self.omegaD=omegaD
  17. def run(self):
  18. _time=0
  19. while(_time<self.time):
  20. self.omega.append(self.omega[-1]-((self.g/self.l)*math.sin(self.theta[-1])+\
  21. self.q*self.omega[-1]-self.Fd*math.sin(self.omegaD*self.t[-1]))*self.dt)
  22. self.theta.append(self.theta[-1]+self.omega[-1]*self.dt)
  23. self.t.append(_time)
  24. _time += self.dt
  25. def show_results(self):
  26. pl.plot(self.t,self.theta)
  27. pl.xlabel('time(s)')
  28. pl.ylabel('theta')
  29. pl.show()
  30. a = Simple_Pendulum()
  31. a.run()
  32. a.show_results()

程序运行结果如图:
image_1b0psmjbbo6s9gs8le119v1io91g.png-39.8kB
结果与书上Figure 3.5相同

2. Problem 3.13&3.14

接下来开始考虑两单摆角度差的关系,并回答习题3.13和3.14相关内容

2.1 首先,我们先进行准备工作,即作出与t的关系图像,这里仅需将代码做如下改动:

  1. self.omega1.append(self.omega1[-1]-((self.g/self.l)*math.sin(self.theta1[-1])+\
  2. self.q*self.omega1[-1]-self.Fd*math.sin(self.omegaD*self.t[-1]))*self.dt)
  3. self.theta1.append(self.theta1[-1]+self.omega1[-1]*self.dt)
  4. self.omega2.append(self.omega2[-1]-((self.g/self.l)*math.sin(self.theta2[-1])+ self.q*self.omega2[-1]-self.Fd*math.sin(self.omegaD*self.t[-1]))*self.dt)
  5. self.theta2.append(self.theta2[-1]+self.omega2[-1]*self.dt)

另外为了更加直观地看出变化,还需将坐标轴纵轴改为对数坐标,这一功能通过函数semilog实现,结果如图:
image_1b0q5th4q1nmd8s81cdr1k4d18f89.png-46.6kB

2.2 我们考虑给予两个摆不同的阻尼系数,首先,我们先看不同阻尼系数下的运动情况:
image_1b0q83pisle55lv5tb1straaa9.png-61.4kB
为了效果更明显,我们选择0.5与1.2两个,修改程序后,我们得到如下结果:
image_1b0q8ajecp1rgd7ga1pe98fm.png-49kB
这里我们取

3. Problem 3.12

3.1 首先我们作出最基本的图像,即用点图作出的关系图像,主程序如下:

  1. import pylab as pl
  2. import math
  3. class Simple_Pendulum :
  4. def __init__(self,i=0,initial_theta=0.2,time_step=0.04,total_time=60,length=9.8,\
  5. g=9.8, initial_omega=0,q=0.5,Fd=0.5,omegaD=0.66667):
  6. self.theta=[initial_theta]
  7. self.theta0=[initial_theta]
  8. self.t=[0]
  9. self.omega=[initial_omega]
  10. self.dt=time_step
  11. self.time=total_time
  12. self.g=g
  13. self.l=length
  14. self.q=q
  15. self.Fd=Fd
  16. self.omegaD=omegaD
  17. def run(self):
  18. _time=0
  19. while(_time<self.time):
  20. self.omega.append(self.omega[-1]-((self.g/self.l)*math.sin(self.theta[-1])+\
  21. self.q*self.omega[-1]-self.Fd*math.sin(self.omegaD*self.t[-1]))*self.dt)
  22. self.theta.append(self.theta[-1]+self.omega[-1]*self.dt)
  23. self.t.append(_time)
  24. _time += self.dt
  25. if(self.theta[-1]>=math.pi):
  26. self.theta[-1]=self.theta[-1]-2*math.pi
  27. if(self.theta[-1]<=-math.pi):
  28. self.theta[-1]=self.theta[-1]+2*math.pi
  29. def show_results(self):
  30. pl.plot(self.theta,self.omega,'.')
  31. pl.xlabel('time(s)')
  32. pl.ylabel('theta')
  33. pl.legend()
  34. pl.ylim(-1,1)
  35. pl.show()
  36. pl.title('$\omega$ versus $\\theta$ with $F_{D}$=0.5' )
  37. a = Simple_Pendulum()
  38. a.run()
  39. a.show_results()

结果如图:
image_1b0q8qvg01rjkv8c12pf487oad1g.png-41.7kB

3.2 这时,我们改变打点的方式,即令只在满足时打点,其中n为整数,则我们需要修改程序如下,即添加筛选功能的部分。考虑到约等号,即t不会是的整数倍,即余数不会完全等于0,故仅令其小于0.1(其实更小会更符合题目要求,但为使图像效果更好,此时的总时长已被修改为3000,更大精度意味着更长的计算时间,考虑到计算能力如此更合适):

  1. if(self.t[-1]%(2*math.pi/self.omegaD)<0.1):
  2. self.a.append(self.omega[-1])
  3. self.b.append(self.theta[-1])

这样,我们得到如下图像:
image_1b0rln61e1lm4k7h1q541p5r1s679.png-39.4kB

3.3 接下来,我们改变条件,即令 满足最大驱动力或在相空间最高点差时打点,则需将条件修改如下:

  1. if((self.t[-1]-math.pi/4)%(2*math.pi/self.omegaD)<0.1 ):
  2. self.a.append(self.omega[-1])
  3. self.b.append(self.theta[-1])

结论

我们通过以上的探索,可以整理结果如下:
1. 的关系如下图所示:
image_1b0rq9cbd2lfvs41pd71ga41oj5m.png-52.8kB

2.当我们使初始的两个单摆有不同的阻尼系数时,有如下图像:
image_1b0q8ajecp1rgd7ga1pe98fm.png-49kB
3.随后考虑之间的关系,此时仅当满足时打点如下:
image_1b0rln61e1lm4k7h1q541p5r1s679.png-39.4kB
满足最大驱动力或在相空间最高点差时打点时:
image_1b0rqib691tqs1o8jsl517mi1ie513.png-40.4kB
可见明显不同

反思
1.正如figure 3.6下写道注意控制角度的范围,否则会对结果造成影响,在本次作业初始阶段,写带受迫振动项的单摆运动程序时便出现了下列状况。开始由于没有考虑的范围,所做图像如下:
image_1b0pqfhjf1g2i69hrfn1k8fkp013.png-38.1kB
考虑后修正程序如下:

  1. if(self.theta[-1]>=math.pi):
  2. self.theta[-1]=self.theta[-1]-2*math.pi
  3. if(self.theta[-1]<=-math.pi):
  4. self.theta[-1]=self.theta[-1]+2*math.pi

所绘图像如下:
image_1b0pqd9sk17oadpr28rmmc1jh8m.png-46.9kB
注,与书上图像不尽相同的原因是所取初始角度不同,这里为0.1rad

2.利用semilog函数改变坐标轴标度可以使图像更易于分析,在未用时所做图像如下,此为时:
image_1b0rqpj4gv39ik1qt7hlflmf1t.png-36kB
下面为修改后的图像,差异明显
image_1b0rqoj7p144n1lc4h7d19kk7ke1g.png-46.9kB

鸣谢

1.张梓桐同学提供了函数pl.semilog,使程序可以改变纵坐标轴的刻度值
2.参考网页http://ieroot.com/2014/05/07/1566.html学习了绘图技巧

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