[关闭]
@zy-0815 2016-12-18T16:52:35.000000Z 字数 2518 阅读 969

计算物理第十三次作业Problem6.9


摘要

在上一次作业中主要研究了通过Gauss-Sideal Method来求解拉普拉斯方程,这次作业主要学习如何求解波动方程。

背景

由书可知,波动的运动方程为:


最终通过求解可得

对于一端固定,一端自由的弦其自由端位移表达式有所改动,为:

其中M为最右端质点位置的计数值。

正文

程序为:

  1. import numpy as np
  2. import pylab as pl
  3. import math
  4. class wave:
  5. def __init__(self,L=1,c=300,dx=0.001,T=0.1,x0=0.05,X0=0.4):
  6. self.L=L
  7. self.c=c
  8. self.dx=dx
  9. self.dt=dx/c
  10. self.T=T
  11. self.t=[0]
  12. self.y1=[]
  13. self.y2=[]
  14. self.y3=[]
  15. self.y0=[]
  16. self.x0=x0
  17. self.X0=X0
  18. for i in range(1001):
  19. self.y0.append(math.exp(-1000*pow((0.001*i-self.X0),2)))
  20. self.y0[0]=0
  21. self.y=[]
  22. self.Y=[self.y0]
  23. def propagate(self):
  24. self.y1=self.y2=self.y0
  25. self.y.append(self.y2[int(self.x0/0.001)])
  26. while self.t[-1]<self.T:
  27. self.t.append(self.t[-1]+self.dt)
  28. self.y3.append(0)
  29. for i in range(999):
  30. self.y3.append(-self.y1[i+1]+self.y2[i+2]+self.y2[i])
  31. self.y3.append(self.y2[1000]+self.y2[999]-self.y1[1000])
  32. self.y.append(self.y3[int(self.x0/0.001)])
  33. self.y1=self.y2
  34. self.y2=self.y3
  35. self.y3=[]
  36. for i in range(10):
  37. if len(self.t)==i*100:
  38. self.Y.append(self.y2)
  39. a=wave()
  40. a.propagate()
  41. P=(abs(np.fft.rfft(a.y)))**2
  42. frequency=np.linspace(0, a.c/(a.dx*2), len(P))
  43. pl.plot(frequency,P)
  44. pl.xlim(0,5000)
  45. pl.xlabel("frequency")
  46. pl.ylabel("power")
  47. pl.show()
  48. pl.plot(frequency,P)
  49. pl.xlim(0,3000)
  50. pl.xlabel("frequency")
  51. pl.ylabel("power")
  52. pl.show()
  53. x=[]
  54. for i in range(1001):
  55. x.append(i*0.001)
  56. for i in range(len(a.Y)):
  57. pl.plot(x,a.Y[i])
  58. pl.ylim(-1,1)
  59. pl.xlabel("x/m")
  60. pl.ylabel("y/m")
  61. pl.show()

运行结果为:
image_1b49cn5qtvi71alomvk14ekc5l9.png-17.4kB
image_1b49co1im1uubm9iunr9q89qem.png-17.9kB
image_1b49cp2m6n0is79136d1r6h163013.png-17.2kB
image_1b49cqp111q3j1m1l1tknnk3qi1g.png-17.9kB
image_1b49crfafr7paok2jla0k1rsu1t.png-18.3kB
频谱图为:
image_1b49cvabhfuqvcg1fmr1eiv11bp2n.png-19.8kB
对于两端固定的弦,有程序:

  1. import numpy as np
  2. import pylab as pl
  3. import math
  4. class wave:
  5. def __init__(self,L=1,c=300,dx=0.001,T=0.04,x0=0.05,X0=0.4):
  6. self.L=L
  7. self.c=c
  8. self.dx=dx
  9. self.dt=dx/c
  10. self.T=T
  11. self.t=[0]
  12. self.y1=[]
  13. self.y2=[]
  14. self.y3=[]
  15. self.y0=[]
  16. self.x0=x0
  17. self.X0=X0
  18. for i in range(1001):
  19. self.y0.append(math.exp(-1000*pow((0.001*i-self.X0),2)))
  20. self.y0[0]=0
  21. self.y=[]
  22. self.Y=[self.y0]
  23. def propagate(self):
  24. self.y1=self.y2=self.y0
  25. self.y.append(self.y2[int(self.x0/0.001)])
  26. while self.t[-1]<self.T:
  27. self.t.append(self.t[-1]+self.dt)
  28. self.y3.append(0)
  29. for i in range(999):
  30. self.y3.append(-self.y1[i+1]+self.y2[i+2]+self.y2[i])
  31. self.y3.append(0)
  32. self.y.append(self.y3[int(self.x0/0.001)])
  33. self.y1=self.y2
  34. self.y2=self.y3
  35. self.y3=[]
  36. for i in range(10):
  37. if len(self.t)==i*100:
  38. self.Y.append(self.y2)
  39. a=wave()
  40. a.propagate()
  41. P=(abs(np.fft.rfft(a.y)))**2
  42. frequency=np.linspace(0,a.c/(a.dx*2),len(P))
  43. pl.plot(frequency,P)
  44. pl.xlim(0,3000)
  45. pl.xlabel("frequency")
  46. pl.ylabel("power")
  47. pl.show()

运行结果为:
image_1b49d538gilau7r1rd91gj89rt34.png-17kB

结论

通过运行程序,可以发现一端自由一端固定的弦其频谱图与两端固定的弦的频谱图不同。

致谢

齐诚同学的耐心帮助。

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