[关闭]
@rhj 2018-01-01T23:44:41.000000Z 字数 2719 阅读 112

计算物理期末作业

混沌(chaos)现象最初是由气象学家爱德华·罗伦兹通过计算机进行天气模拟时 无意中发现的。在其所描绘的天气动力学系统中,初始条件下的微小变动能够产生巨大的连锁反应,从而使的天气模式发生巨大的变化。又有人将此称为蝴蝶效应。

这是洛伦兹当时提出的方程 虽然现在看来这个方程描述天气有些过于简化了,但它却保留了最基本的情况。 其中r是表示温差影响x,y,z分别表示空气温度、密度、速度。这是取σ=10,r=30,b=8/3时的图形 程序如下 import matplotlib as mpl

  1. from mpl_toolkits.mplot3d import Axes3D
  2. #import numpy as np
  3. import matplotlib.pyplot as plt
  4. xs, ys, zs = [], [], []
  5. def mkPoints():
  6. σ,r,b = 10.0, 30, 8.0 / 3.0
  7. h = 0.001
  8. x0, y0, z0 = 0.1, 0, 0
  9. for i in range(5000):
  10. x1 = x0 + h * σ * (y0 - x0)
  11. y1 = y0 + h * (x0 * (r - z0) - y0)
  12. z1 = z0 + h * (x0 * y0 - b * z0)
  13. x0, y0, z0 = x1, y1, z1
  14. xs.append(x0)
  15. ys.append(y0)
  16. zs.append(z0)
  17. if __name__ == "__main__":
  18. mpl.rcParams["legend.fontsize"] = 15
  19. fig = plt.figure()
  20. ax = Axes3D(fig)
  21. mkPoints()
  22. ax.plot(xs, ys, zs, label = "Lorenz's strange attractor r=30")
  23. ax.legend()
  24. plt.show()`

这是洛伦兹方程所描绘的图形,即洛伦兹双吸引子。尽管Lorenz系统起源于大气对流模型,但实际上他是几个物理系统的共同简化模型,如激光装置及几个相关的对流问题。

另外Rössler attractor是一组三元非线性微分方程代表的吸引子

取a=b=0.2 c=5.7画出右图 代码如下

  1. import matplotlib as mpl
  2. from mpl_toolkits.mplot3d import Axes3D
  3. #import numpy as np
  4. import matplotlib.pyplot as plt
  5. import math
  6. a=0.2
  7. r=5.7
  8. b=0.2
  9. h=0.001
  10. x0, y0, z0 = 0.1, 0, 0
  11. for i in range(100000):
  12. x1 = x0 - h * (y0 + z0)
  13. y1 = y0 + h * (x0 +a*y0)
  14. z1 = z0 + h * (z0*(x0-r)+b)
  15. x0, y0, z0 = x1, y1, z1
  16. xs.append(x0)
  17. ys.append(y0)
  18. zs.append(z0)
  19. if __name__ == "__main__":
  20. mpl.rcParams["legend.fontsize"] = 15
  21. fig = plt.figure()
  22. ax = Axes3D(fig)
  23. mkPoints()
  24. ax.plot(xs, ys, zs, label = "russler's strange attractor c=5.7")
  25. ax.legend()
  26. plt.show()

rossler系统是一个人为设计的系统,其目的仅仅只是为了得到奇异吸引子的一个模型。事实上可以说rossler吸引子时lorenz模型的模型。

1983年由蔡少棠发表的蔡氏电路也可以表现出标准的混沌理论行为,其电路方程可以简化为

取p=10,q=14.87,m=-0.68,n=-1.27画出下图 代码如下

  1. import matplotlib as mpl
  2. from mpl_toolkits.mplot3d import Axes3D
  3. import matplotlib.pyplot as plt
  4. import math
  5. xs, ys, zs = [], [], []
  6. p=10.0
  7. q=14.87
  8. m=-0.68
  9. n=-1.27
  10. def mkPoints():
  11. p=10.0
  12. q=14.87
  13. m=-0.68
  14. n=-1.27
  15. h=0.001
  16. x0, y0, z0 = 0.1, 0, 0
  17. for i in range(100000):
  18. x1 = x0 + h * p*(-x0+y0-m*x0-0.5*(n-m)*(abs(x0+1)-abs(x0-1)))
  19. y1 = y0 + h * (x0-y0+z0)
  20. z1 = z0 - h * q*y0
  21. x0, y0, z0 = x1, y1, z1
  22. xs.append(x0)
  23. ys.append(y0)
  24. zs.append(z0)
  25. if name == "main":
  26. mpl.rcParams["legend.fontsize"] = 15
  27. fig = plt.figure()
  28. ax = Axes3D(fig)`

这个图形是双涡旋的混沌吸引子。函数 f(x) 描述了非线性电阻的电子响应。作为一个最简单的实验实现的电路,并且存在一种简单而准确的理论模型相结合,使蔡氏电路成为一个研究混沌理论的许多基础研究和应用的问题的实用系统。二次迭代是确定性动力系统中的混沌最流行和最重要的范例,但同时,它也是奇异的分形之源。

曼德勃罗集是分形中最流行的分形。点集均出自公式 对于非线性迭代公式,所有使得无限迭代后的结果能保持有限数值的复数C的集合,构成曼德勃罗集。其图形如下

代码如下

  1. import numpy as np
  2. import pylab as pl
  3. from matplotlib import cm
  4. def fractal(c):
  5. z = c
  6. for i in range(1, 1000):
  7. if abs(z)>5: break
  8. z = z*z+c
  9. return i
  10. def mandelbrot(cx, cy, d):
  11. x0, x1, y0, y1 = cx-d, cx+d, cy-d, cy+d
  12. y,x = np.ogrid[y0:y1:400j,x0:x1:400j]
  13. c = x + y*1j
  14. mandelbrot = np.frompyfunc(fractal,1,1)(c).astype(np.float)
  15. pl.imshow(mandelbrot, cmap=cm.Greens_r, extent=[x0,x1,y0,y1])
  16. mandelbrot(-0.5,0,1.2)
  17. pl.show()

另外当把迭代公式改变时如 时图形如右图

而再变为 时图形如右图

可以看出分形图形与迭代公式有着密切的联系。

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