Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.35 KB | None | 0 0
  1.  
  2. # coding: utf-8
  3.  
  4. # In[21]:
  5.  
  6. # 3 Set 3
  7. # 3.1 Eigenmodes of drums or membranes of dierent shapes
  8.  
  9.  
  10. # In[45]:
  11.  
  12. import numpy as np
  13. import scipy.sparse.linalg as sc
  14. import scipy.linalg as scnorm
  15. import matplotlib.pyplot as plt
  16. size = 50
  17. setting = 1
  18.  
  19. #1. create the matrix a
  20. def matrix(size, setting):
  21. dx = size / (size - 1)
  22. B = np.identity(size ) * (-4)
  23. counter = 0
  24. sizeCounter = size
  25. for i in range(1, size):
  26. B[i, counter] = 1
  27. B[counter, i] = 1
  28. counter += 1
  29. # B[0,:]=0
  30. # B[:,0]=0
  31. # B[size-1,:]=0
  32. # B[:,size-1]=0
  33.  
  34. I=np.identity(size)
  35. # I[0,:]=0
  36. # I[:,0]=0
  37. # I[size-1,:]=0
  38. # I[:,size-1]=0
  39. if setting == 1:
  40. middle = np.floor(len(B) / 2)
  41. for i in range(0, size):
  42. for j in range(0, size):
  43. if( np.sqrt((i - middle)**2 + (j - middle)**2) > middle): B[i, j] = 0
  44. if( np.sqrt((i - middle)**2 + (j - middle)**2) > middle): I[i, j] = 0
  45. else:
  46. middle = np.floor(len(B) / 2)
  47. L = 20
  48. N = 10
  49. for i in range(0, size):
  50. for j in range(0, size):
  51. if(i < L or i > size - L or j > size - N or j < N): B[i, j] = 0
  52. if(i < L or i > size - L or j > size - N or j < N): I[i, j] = 0
  53. return B,I
  54.  
  55. #used to find the middle of the matrix
  56.  
  57. #2. create the vector b with starting conditions
  58. def vector(size):
  59. b = np.zeros([size, size])
  60. vertical = np.floor(len(b) / 2)
  61. # point06 = np.floor((len(b) - vertical) * 0.3)
  62. # point12 = np.floor((len(b) - vertical) * 0.6)
  63. # b[int(point06), int(point12)] = 10
  64. b[int(vertical * 1.2), int(vertical / 1.6)] = 1
  65. bcolumn = b.T.reshape(size**2, 1)
  66.  
  67. return bcolumn
  68.  
  69.  
  70. B, I = matrix(size, setting)
  71. A = np.zeros((size, size))
  72.  
  73. M = []
  74. for i in range(size):
  75. if i == 0:
  76. M.append(np.concatenate([ B, I, np.tile(A, (1, size-2)) ], axis = -1 ))
  77. elif i == size-1:
  78. M.append(np.concatenate([ np.tile(A, (1, size-2)), I, B ], axis = -1))
  79. else:
  80. M.append(np.concatenate([ np.tile(A, (1, i-1)), I, B, I, np.tile(A, (1, size-i-2))], axis = -1))
  81. M = np.concatenate(M, axis = 0)
  82.  
  83. #circle domain
  84. if setting == 1:
  85. middle = np.floor(len(B) / 2)
  86. for i in range(size):
  87. for j in range(size):
  88. if( np.sqrt((i - middle)**2 + (j - middle)**2) > middle): B[i, j] = 0
  89. if( np.sqrt((i - middle)**2 + (j - middle)**2) > middle): I[i, j] = 0
  90. else:
  91. L = 20
  92. N = 10
  93. for i in range(size):
  94. for j in range(size):
  95. if(i < L or i > size - L or j > size - N or j < N): B[i, j] = 0
  96. if(i < L or i > size - L or j > size - N or j < N): I[i, j] = 0
  97.  
  98. # make the matrix not singular
  99. for i in range(size**2):
  100. if M[i,i]==0: M[i,i]=1
  101.  
  102.  
  103.  
  104. # M = M / (1/size)**2
  105. b = vector(size)
  106. solution = sc.spsolve(M, b)
  107. solution = solution.reshape(size, size)
  108. middle = np.floor(len(solution) / 2)
  109. if setting == 1:
  110. for i in range(size):
  111. for j in range(size):
  112. if( np.sqrt((i - middle)**2 + (j - middle)**2) > middle): solution[i, j] = np.nan
  113. else:
  114. L = 20
  115. N = 10
  116. for i in range(size):
  117. for j in range(size):
  118. if(i < L or i > size - L or j > size - N or j < N): solution[i, j] = np.nan
  119.  
  120. #print(M)
  121. # plt.imshow(M,interpolation='none')
  122. # plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement