[关闭]
@zy-0815 2017-01-07T16:42:38.000000Z 字数 3004 阅读 2512

计算物理期末作业(random walks)

王冠 天眷班 2014301020003


摘要

  在以前我们学习过不确定的系统如混沌系统,但大多数时候我们将重点放在确定性的系统上,这次作业我们研究一个随机系统———随机行走。

背景

  随机游走(random walk)也称随机漫步,随机行走等是指基于过去的表现,无法预测将来的发展步骤和方向。核心概念是指任何无规则行走者所带的守恒量都各自对应着一个扩散运输定律,接近于布朗运动,是布朗运动理想的数学状态,现阶段主要应用于互联网链接分析及金融股票市场中。 
image_1b5rgpsa53regdl1g411kq9ukv9.png-93.7kB

正文

  首先我们要构建模型,和普通的动态系统不同,随机行走没有动态方程。但是他的运动可以按照如下过程来进行描述:
  首先设置一个位置为x,然后产生一个随机数m(0<=m<=1),将m和一个确定的概率数P进行比较,当m大于P时,x+1,当m小于P时,x-1。(此时假设每一步都是均匀的)
  同时行走的距离与时间t成正比。
  则程序如下:

  1. import numpy as np
  2. from pylab import *
  3. from math import *
  4. import random
  5. def Random_walk():
  6. x=[0]
  7. x2=[0]
  8. global n
  9. n=100
  10. for i in range(n):
  11. r=random.uniform(0,1)
  12. if r<0.5:
  13. x.append(x[i]+1)
  14. else:
  15. x.append(x[i]-1)
  16. x2.append(x[i+1]**2)
  17. print r
  18. x2=array(x2)
  19. return [x,x2]
  20. n=100
  21. time=range(n+1)
  22. m=500
  23. x_1=Random_walk()[0]
  24. x_2=Random_walk()[0]
  25. x2=Random_walk()[1]
  26. for i in range(m):
  27. x2=x2+Random_walk()[1]
  28. x2=x2/(m+1)
  29. figure(figsize=[16,8])
  30. subplot(121)
  31. plot(time,x_1)
  32. plot(time,x_2)
  33. xlim(0,100)
  34. xlabel('step number')
  35. ylabel('x')
  36. title('Random walk in one dimension')
  37. subplot(122)
  38. scatter(time,x2,s=1)
  39. plot(time,time)
  40. xlim(0,100)
  41. xlabel('step number')
  42. ylim(0,100)
  43. ylabel('$<x^2>$')
  44. title('Random walk in one dimension')
  45. show()

运行结果如下:
1、
image_1b5riq1b8lmu1g2npemil0htem.png-35.5kB
image_1b5rp6ttn3t010ju11fh1fpq1ppj9.png-20.8kB
2、
image_1b5rquha414h9mo2iq9fvlmv7m.png-32kB
image_1b5rqv0dh3po1aut1nur1gm51qpo13.png-20.3kB
  由两次运行结果可知,即使对于相同的程序,运行多次结果也是完全不同的,同时由运行结果图二可知,这些点都在一条线的附近,因此与时间t呈线性关系。
此为一般情况下的随机行走情况,下面对随机行走进行多方面考虑:
(1)随机行走中向左走和向右走的概率不一样,假设向左走的概率P=0.3,则有
image_1b5s0raad4vkfd51epekp516674a.png-47.4kB
可以看出此时运行结果已经有蛮大的偏向性。
(2)随机行走中一步迈的距离随机,处于0~1之间,则程序为:

  1. import numpy as np
  2. from pylab import *
  3. from math import *
  4. import random
  5. def Random_walk():
  6. x=[0]
  7. x2=[0]
  8. global n
  9. n=100
  10. for i in range(n):
  11. dx=random.uniform(-1,1)
  12. x.append(x[i]+dx)
  13. x2.append(x[i+1]**2)
  14. x2=array(x2)
  15. return [x,x2]
  16. n=100
  17. time=range(n+1)
  18. m=500
  19. x_1=Random_walk()[0]
  20. x_2=Random_walk()[0]
  21. x2=Random_walk()[1]
  22. for i in range(m):
  23. x2=x2+Random_walk()[1]
  24. x2=x2/(m+1)
  25. time=array(time)
  26. figure(figsize=[16,8])
  27. subplot(121)
  28. plot(time,x_1)
  29. plot(time,x_2)
  30. xlim(0,100)
  31. xlabel('step number')
  32. ylabel('x')
  33. title('Random step length')
  34. subplot(122)
  35. scatter(time,x2,s=1)
  36. plot(time,time/3.0)
  37. xlim(0,100)
  38. xlabel('step number')
  39. ylim(0,)
  40. ylabel('$<x^2>$')
  41. text(60,15,'$<x^2>=t/3$')
  42. title('Random step length')
  43. show()

运行结果为:
image_1b5rrqevgesfd0n9oq11giobv2a.png-51.1kB
(3)二维运动时,在程序中用两个数组进行表示即可,可得到如下运行结果:
image_1b5rtha8h1p03q5c1lbd6e5116es.png-50.2kB
(4)在三维运动中,其运动程序如下:

  1. import numpy as np
  2. from pylab import *
  3. from math import *
  4. import random
  5. import mpl_toolkits.mplot3d
  6. def Random_walk():
  7. x=[0]
  8. y=[0]
  9. z=[0]
  10. r2=[0]
  11. global n
  12. n=500
  13. for i in range(n):
  14. r_x=random.uniform(0,1)
  15. r_y=random.uniform(0,1)
  16. r_z=random.uniform(0,1)
  17. if r_x<0.5:
  18. x.append(x[i]+1/sqrt(3))
  19. else:
  20. x.append(x[i]-1/sqrt(3))
  21. if r_y<0.5:
  22. y.append(y[i]+1/sqrt(3))
  23. else:
  24. y.append(y[i]-1/sqrt(3))
  25. if r_z<0.5:
  26. z.append(z[i]+1/sqrt(3))
  27. else:
  28. z.append(z[i]-1/sqrt(3))
  29. r2.append(x[i+1]**2+y[i+1]**2+z[i+1]**2)
  30. r2=array(r2)
  31. return [x,y,z,r2]
  32. n=500
  33. time=range(n+1)
  34. m=500
  35. Ran=Random_walk()
  36. x=Ran[0]
  37. y=Ran[1]
  38. z=Ran[2]
  39. r2=Ran[3]
  40. for i in range(m):
  41. r2=r2+Random_walk()[3]
  42. r2=r2/(m+1)
  43. fig = figure()
  44. ax = fig.add_subplot(111, projection='3d')
  45. ax.plot(x, y, z)
  46. ax.set_xlabel('x')
  47. ax.set_ylabel('y')
  48. ax.set_zlabel('z')
  49. title('random walk(three dimension)')
  50. figure()
  51. scatter(time,r2,s=1)
  52. plot(time,time)
  53. xlim(0,500)
  54. xlabel('step number')
  55. ylim(0,500)
  56. ylabel('$<x^2>$')
  57. title('Random walk(three dimension)')
  58. show()

运行结果为:
image_1b5rv0lho1jvkidmp53af616fd3g.png-52.9kB
由图二可以看出,其运动距离与步数仍然成正比线性关系。
1000步时
image_1b5rus9is1h921i6737id55dc123.png-53.8kB
5000步时
image_1b5rv5c7nftlr0fh919r51efj3t.png-62.4kB

结论

随机行走模型在实际操作中具有很大的不确定性,但是距离与步数具有一定的关系(大多为线性)。

致谢及参考文献

蔡教授的认真指导.
宗玥同学的耐心讨论.
Nicholas J. Giordano & Hisao Nakanishi.计算物理.清华大学出版社.

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