当前位置:   article > 正文

python pde adi(抛物型差分(二维—ADI格式))_python的adi库

python的adi库
  1. #coding:utf-8
  2. from mpl_toolkits.mplot3d import axes3d
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. import time
  6. def createMatrix( m, n):
  7. A = np.zeros( (n + 2,m + 2))
  8. Up = np.ones( (m+2,1)) * 100
  9. Down = np.ones((m+2, 1)) * 0
  10. Lf = np.ones((1, n + 2)) * 75
  11. Rt = np.ones((1, n + 2) )* 50
  12. A[0,:] = Up.ravel()
  13. A[n+1,:] = Down.ravel()
  14. A[:,0] = Lf.ravel()
  15. A[:, m +1] = Rt.ravel()
  16. return A
  17. def oneIter(A, r_lf, r_rt):
  18. a_size = A.shape
  19. m = a_size[1] - 2
  20. n = a_size[0] - 2
  21. #create init ImpMatrix M and b
  22. M = np.diag( np.ones((1,m)).ravel() * ( 1 + r_lf))
  23. M = M + np.diag( np.ones( (1, m-1)).ravel() * ( -1.0 * r_lf / 2), 1)
  24. M = M + np.diag( np.ones( (1, m-1)).ravel() * ( -1.0 * r_lf / 2), -1)
  25. B = A.copy()
  26. for j in range(1, n + 1 ):
  27. b = np.zeros((m,1))
  28. rowA = A[j,:]
  29. b[0] = b[0] + rowA[0] * r_lf / 2
  30. b[m-1] = b[m-1] + rowA[m-1] * r_lf /2
  31. for i in range(1, m+1):
  32. colA = A[j-1:j+1+1,i]
  33. b[i-1] = b[i-1] + r_rt / 2 * colA[0] + ( 1 - r_rt) * colA[1] + r_rt / 2 * colA[2]
  34. B[j,1:m+1] = np.linalg.solve(M, b).ravel()
  35. return B
  36. def computeA(m, n , rx, ry, iter):
  37. A = createMatrix(m,n)
  38. print 'total iter=%s' % (iter)
  39. for i in range(1, iter):
  40. print 'iter num=%s' % (i)
  41. A = oneIter(A, rx,ry)
  42. B = oneIter(np.transpose(A), ry, rx)
  43. A = np.transpose(B)
  44. return A
  45. def computeOneIter(A, m, n , rx, ry):
  46. A = oneIter(A, rx,ry)
  47. B = oneIter(np.transpose(A), ry, rx)
  48. A = np.transpose(B)
  49. return A
  50. def getStart():
  51. X_INTERVAL = [0,20]
  52. Y_INTERVAL = [0,30]
  53. T = [0,10]
  54. deltax = 0.5
  55. deltay = 0.3
  56. tao = 1.0 / 3 * min(deltax, deltay) * min(deltax, deltay)
  57. m = (X_INTERVAL[1] - X_INTERVAL[0]) / deltax - 1
  58. n = (Y_INTERVAL[1] - Y_INTERVAL[0]) / deltay - 1
  59. m = int(m)
  60. n = int(n)
  61. print 'm=%s,n=%s' % (m,n)
  62. x = np.linspace(X_INTERVAL[0], X_INTERVAL[1], m)
  63. y = np.linspace(Y_INTERVAL[0], Y_INTERVAL[1], n)
  64. #A = computeA(m,n,tao/deltax/deltax, tao/deltay/deltay, int((T[1] - T[0])/tao))
  65. #animation
  66. fig = plt.figure()
  67. ax = fig.add_subplot(111, projection='3d')
  68. X = x
  69. Y = y
  70. X, Y = np.meshgrid(X, Y)
  71. wframe = None
  72. iter = int((T[1] - T[0])/tao)
  73. A = createMatrix(m-2,n-2)
  74. for i in range(iter):
  75. A = computeOneIter(A,m,n,tao/deltax/deltax, tao/deltay/deltay)
  76. if wframe:
  77. ax.collections.remove(wframe)
  78. wframe = ax.plot_wireframe(X, Y, A, rstride=2, cstride=2)
  79. plt.pause(0.01)
  80. print 'iter=',i
  81. m = A.shape[0]
  82. n = A.shape[1]
  83. return A,x,y
  84. if __name__ == '__main__':
  85. getStart()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/434031
推荐阅读
相关标签
  

闽ICP备14008679号