[关闭]
@computationalphysics-2014301020090 2016-12-11T16:28:07.000000Z 字数 6789 阅读 170

Codes

Code 1

  1. import numpy as np
  2. from pylab import *
  3. from math import *
  4. import mpl_toolkits.mplot3d
  5. V0=[[0 for i in range(21)]for j in range(21)]#i represents x, j represents y
  6. for i in [6]:
  7. for j in range(6,15):
  8. V0[j][i]=1.0# j,i
  9. for i in [15]:
  10. for j in range(6,15):
  11. V0[j][i]=-1.0
  12. #check
  13. #for j in range(len(V0)):
  14. # for i in range(len(V0[1])):
  15. # print V0[i][j],
  16. # print
  17. VV=[]
  18. VV.append(V0)
  19. s=0
  20. dx=0.1
  21. #iteration
  22. #for k in range(100):
  23. while 1:
  24. VV.append(V0)
  25. for i in range(1,len(V0)-1):
  26. for j in range(1,len(V0[1])-1):
  27. VV[s+1][i][j]=(VV[s][i+1][j]+VV[s][i-1][j]+VV[s][i][j+1]+VV[s][i][j-1])/4.0
  28. for i in [6]:
  29. for j in range(6,15):
  30. VV[s+1][j][i]=1.0
  31. for i in [15]:
  32. for j in range(6,15):
  33. VV[s+1][j][i]=-1.0
  34. VV[s]=np.array(VV[s])
  35. VV[s+1]=np.array(VV[s+1])
  36. dVV=VV[s+1]-VV[s]
  37. dV=0
  38. for i in range(1,len(V0)-1):
  39. for j in range(1,len(V0[1])-1):
  40. dV=dV+abs(dVV[i][j])
  41. #print dV
  42. s=s+1
  43. if dV<0.0001 and s>10:
  44. break
  45. print s
  46. V=array(VV[-1])
  47. Ex=array(V0)
  48. Ey=array(V0)
  49. for j in range(1,len(V0)-1):
  50. for i in range(1,len(V0[1])-1):
  51. Ex[j][i]=-(V[j][i+1]-V[j][i-1])/(2*dx)
  52. Ey[j][i]=-(V[j+1][i]-V[j-1][i])/(2*dx)
  53. #for i in range(len(V)):
  54. # for j in range(len(V[1])):
  55. # print V[i][j],
  56. # print
  57. figure(figsize=[8,8])
  58. x=np.arange(-1.0,1.01,dx)#-1.0,-0.9,...,1.0
  59. y=np.arange(-1.0,1.01,dx)
  60. X,Y=np.meshgrid(x,y)
  61. CS = contour(X,Y,V,15)
  62. clabel(CS, inline=1, fontsize=10)
  63. xlim(-1,1)
  64. xlabel('x')
  65. ylim(-1,1)
  66. ylabel('y')
  67. title('contours of electric potential')
  68. savefig('electric potential J.png')
  69. fig = figure()
  70. ax = fig.add_subplot(111, projection='3d')
  71. ax.plot_surface(X, Y, V,rstride=1, cstride=1,linewidth=0)
  72. ax.set_xlabel('X')
  73. ax.set_ylabel('Y')
  74. ax.set_zlabel('V')
  75. title('electric potential')
  76. savefig('electric potential J 3D.png')
  77. figure(figsize=[8,8])
  78. Q=quiver(X,Y,Ex,Ey,scale=100)
  79. xlim(-1,1)
  80. xlabel('x')
  81. ylim(-1,1)
  82. ylabel('y')
  83. title('electric field')
  84. savefig('electric field J.png')
  85. show()

Code 2

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from mpl_toolkits.mplot3d import Axes3D
  4. from matplotlib import cm
  5. from matplotlib.ticker import LinearLocator, FormatStrFormatter
  6. class jacobi:
  7. """
  8. Jacobi method
  9. """
  10. def __init__(self):
  11. pass
  12. def initialization(self,initial_file):
  13. itxt= open(initial_file)
  14. self.lattice_in = []
  15. self.lattice_out = []
  16. for lines in itxt.readlines():
  17. lines=lines.replace("\n","").split(",")
  18. #print lines[0].split(" ")
  19. self.lattice_in.append(lines[0].split(" "))
  20. self.lattice_out.append(lines[0].split(" "))
  21. itxt.close()
  22. #print self.lattice_in
  23. #print self.initial_lattice
  24. for i in range(len(self.lattice_in)):
  25. for j in range(len(self.lattice_in[i])):
  26. self.lattice_in[i][j] = float(self.lattice_in[i][j])
  27. self.lattice_out[i][j] = float(self.lattice_out[i][j])
  28. return 0
  29. def evolution(self):
  30. delta = 10
  31. self.N = 0
  32. delta_record = []
  33. while (delta > 0.00001*len(self.lattice_in)*len(self.lattice_in[0])):
  34. delta = 0
  35. for i in range(1,len(self.lattice_in) - 1):
  36. for j in range(1,len(self.lattice_in[i]) - 1):
  37. if (self.lattice_in[i][j] != 1 and self.lattice_in[i][j] != -1):
  38. self.lattice_out[i][j] = 0.25*(self.lattice_in[i - 1][j] + self.lattice_in[i + 1][j] + self.lattice_in[i][j - 1] + self.lattice_in[i][j + 1])
  39. delta+= abs(self.lattice_out[i][j] - self.lattice_in[i][j])
  40. delta_record.append(delta)
  41. for i in range(len(self.lattice_in)):
  42. for j in range(len(self.lattice_in[i])):
  43. self.lattice_in[i][j] = self.lattice_out[i][j]
  44. self.N+= 1
  45. plt.plot(delta_record,label = 'jacobi method')
  46. print self.N
  47. print len(self.lattice_in)
  48. return 0
  49. def electric_field(self):
  50. self.ex = np.zeros([len(self.lattice_in),len(self.lattice_in)])
  51. self.ey = np.zeros([len(self.lattice_in),len(self.lattice_in)])
  52. deltax = 0.3333
  53. deltay = 0.3333
  54. for i in range(1,len(self.lattice_in) - 1):
  55. for j in range(1,len(self.lattice_in[0]) - 1):
  56. self.ey[i][j] = (-(self.lattice_in[i + 1][j] - self.lattice_in[i - 1][j])/(2*deltax))
  57. self.ex[i][j] = (-(self.lattice_in[i][j + 1] - self.lattice_in[i][j - 1])/(2*deltay))
  58. return 0
  59. def plot_field(self):
  60. self.electric_field()
  61. X, Y = np.meshgrid(np.arange(-1.00, 1.01, 2./(len(self.lattice_in) - 1)), np.arange(-1.00, 1.01, 2./(len(self.lattice_in) - 1)))
  62. #plt.figure(figsize = (8,8))
  63. plt.quiver(X, Y, self.ex, self.ey, pivot = 'mid', units='width')
  64. plt.title('Electric field between two metal plates')
  65. #plt.show()
  66. return 0
  67. def plot_contour(self):
  68. X, Y = np.meshgrid(np.arange(-1.00, 1.01, 2./(len(self.lattice_in) - 1)), np.arange(-1.00, 1.01, 2./(len(self.lattice_in) - 1)))
  69. #plt.figure(figsize = (8,8))
  70. CS = plt.contour(X, Y, self.lattice_in, 13)
  71. plt.clabel(CS, inline=1, fontsize=10)
  72. plt.title('Equipotential lines')
  73. #plt.show()
  74. return 0
  75. def plot_surface(self):
  76. fig = plt.figure()
  77. ax = fig.gca(projection='3d')
  78. X, Y = np.meshgrid(np.arange(-1.00, 1.01, 2./(len(self.lattice_in) - 1)), np.arange(-1.00, 1.01, 2./(len(self.lattice_in) - 1)))
  79. surf = ax.plot_surface(X, Y, self.lattice_in, rstride=1, cstride=1,cmap = cm.coolwarm_r,
  80. linewidth=0, antialiased=False)
  81. ax.set_zlim(-1.01, 1.01)
  82. ax.zaxis.set_major_locator(LinearLocator(10))
  83. ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
  84. fig.colorbar(surf, shrink=0.5, aspect=5)
  85. class SOR(jacobi):
  86. def evolution(self):
  87. delta = 10
  88. self.N = 0
  89. delta_record = []
  90. alpha = 2/(1+np.pi/len(self.lattice_in))
  91. while (delta > 0.00001*len(self.lattice_in)*len(self.lattice_in[0])):
  92. delta = 0
  93. for i in range(1,len(self.lattice_in) - 1):
  94. for j in range(1,len(self.lattice_in[i]) - 1):
  95. if (self.lattice_in[i][j] != 1 and self.lattice_in[i][j] != -1):
  96. self.lattice_out[i][j] = 0.25*(self.lattice_in[i - 1][j] + self.lattice_in[i + 1][j] + self.lattice_in[i][j - 1] + self.lattice_in[i][j + 1])
  97. delta+= abs(self.lattice_out[i][j] - self.lattice_in[i][j])
  98. self.lattice_in[i][j] = alpha * (self.lattice_out[i][j] - self.lattice_in[i][j]) + self.lattice_in[i][j]
  99. #print self.lattice_out
  100. delta_record.append(delta)
  101. self.N+= 1
  102. plt.plot(delta_record, label ='SOR algorithm')
  103. print self.N
  104. print len(self.lattice_in)
  105. #print self.lattice_in
  106. return 0
  107. class SOR_2(jacobi):
  108. def evolution(self,alpha):
  109. delta = 10
  110. self.N = 0
  111. delta_record = []
  112. #alpha = 2/(1+np.pi/len(self.lattice_in))
  113. while (delta > 0.00001*len(self.lattice_in)*len(self.lattice_in[0])):
  114. delta = 0
  115. for i in range(1,len(self.lattice_in) - 1):
  116. for j in range(1,len(self.lattice_in[i]) - 1):
  117. if (self.lattice_in[i][j] != 1 and self.lattice_in[i][j] != -1):
  118. self.lattice_out[i][j] = 0.25*(self.lattice_in[i - 1][j] + self.lattice_in[i + 1][j] + self.lattice_in[i][j - 1] + self.lattice_in[i][j + 1])
  119. delta+= abs(self.lattice_out[i][j] - self.lattice_in[i][j])
  120. self.lattice_in[i][j] = alpha * (self.lattice_out[i][j] - self.lattice_in[i][j]) + self.lattice_in[i][j]
  121. #print self.lattice_out
  122. delta_record.append(delta)
  123. self.N+= 1
  124. #plt.plot(delta_record, label ='SOR algorithm')
  125. print self.N
  126. #print len(self.lattice_in)
  127. #print self.lattice_in
  128. return 0
  129. #A = jacobi()
  130. A = SOR()
  131. A.initialization('initial_capacitor_26.txt')
  132. A.evolution()
  133. #plt.figure(figsize = (8,8))
  134. plt.figure(figsize = (16,8))
  135. plt.subplot(121)
  136. A.plot_contour()
  137. plt.subplot(122)
  138. A.plot_field()
  139. #A.plot_surface()
  140. plt.savefig('chapter5_5.7_26.png', dpi = 256)
  141. plt.show()
  142. ### ----------------------
  143. '''A = jacobi()
  144. B = SOR()
  145. A.initialization('initial_capacitor_26.txt')
  146. B.initialization('initial_capacitor_26.txt')
  147. plt.figure(figsize = (8,8))
  148. plt.xlabel('The number of iteration, N',fontsize = 14)
  149. plt.ylabel(r'$\Delta V$', fontsize = 14)
  150. A.evolution()
  151. B.evolution()
  152. plt.legend()
  153. plt.savefig('chapter5_5.7_alpha.png', dpi = 256)
  154. plt.show()'''
  155. ### ----------------------
  156. '''A = SOR_2()
  157. alpha = 1.00
  158. for i in range(20):
  159. A.initialization('initial_capacitor_26.txt')
  160. A.evolution(alpha)
  161. alpha+=0.05'''
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注