Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.15 KB | None | 0 0
  1. import scipy.io as sio
  2. from scipy import interpolate
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. from mpl_toolkits.mplot3d import Axes3D
  6. from matplotlib import cm
  7. from copy import deepcopy
  8.  
  9. mapa = sio.loadmat("data_map.mat")
  10.  
  11. mapa1 = mapa['data_map']
  12.  
  13. x = mapa1[:, 0]
  14. y = mapa1[:, 1]
  15. z = mapa1[:, 2]
  16. z1 = [0. for i in range(len(x))]
  17.  
  18.  
  19. # [X, Y] = np.meshgrid(x, y)
  20. # [Z, Z] = np.meshgrid(z1, z1)
  21. #
  22. # for i in range(len(x)):
  23. # Z[i][i] = float(z[i])
  24. #
  25. # for j in range(0, len(x)-1):
  26. # for i in range(0, len(x)-j-1):
  27. # Z[i][j+i+1] = (Z[i][j+i] + Z[i+1][j+i+1])/2
  28. # Z[j + i + 1][i] = (Z[i][j + i] + Z[i + 1][j + i + 1]) / 2
  29.  
  30. x1 = np.arange(np.round(min(x), 3), max(x)+0.005, 0.001)
  31. y1 = np.arange(min(y)-0.001, max(y)+0.001, 0.001)
  32. z2 = [0. for i in range(len(x1))]
  33.  
  34. startx = np.round(min(x), 3)
  35. starty = min(y)-0.001
  36.  
  37. [X1, Y1] = np.meshgrid(x1, y1)
  38. [Z1, Z2] = np.meshgrid(z2, z2)
  39.  
  40. for i in range(len(x)):
  41. iks = (np.round(x[i],3) - startx)*1000
  42. iks1 = int(round(iks))
  43. igrek = (np.round(y[i], 3) - starty) * 1000
  44. igrek1 = int(round(igrek))
  45. if Z1[igrek1][iks1] == 0:
  46. Z1[igrek1][iks1] = z[i]
  47. Z2[igrek1][iks1] += 1
  48. else:
  49. Z1[igrek1][iks1] = (Z1[igrek1][iks1]*Z2[igrek1][iks1] + z[i])/(Z2[igrek1][iks1]+1)
  50. Z2[igrek1][iks1] += 1
  51.  
  52. iter = 0
  53. przerwa = 6
  54. zrobiono = False
  55.  
  56. def znajdz_k(lista):
  57. index = -1
  58. for i in range(len(lista)):
  59. if lista[i] != 0:
  60. index = i
  61. break
  62. return index
  63.  
  64. def znajdz_r(lista):
  65. index = -1
  66. for i in range(len(lista)):
  67. if lista[len(lista)-i-1] != 0:
  68. index = len(lista)-i-1
  69. break
  70. return index
  71.  
  72.  
  73. while przerwa < 300:
  74. operacje = 0
  75. if iter % 2 == 0:
  76. for j in range(len(x1)):
  77. kon = False
  78. idx1 = znajdz_k(Z1[0:len(x1), j])
  79. if idx1 != -1:
  80. idx2 = znajdz_k(Z1[idx1+1:len(x1), j]) + idx1+1
  81. else:
  82. kon = True
  83. while not(kon):
  84. if idx1 == -1 or idx2 == -1 or idx1 == idx2:
  85. kon = True
  86. elif np.abs(idx2-idx1) > przerwa+1 or np.abs(idx2-idx1) == 1:
  87. idx1 = deepcopy(idx2)
  88. idx2 = znajdz_k(Z1[idx1 + 1:len(x1), j]) + idx1 + 1
  89. else:
  90. roznica = (Z1[idx2][j] - Z1[idx1][j])/(idx2 - idx1)
  91. for k in range(1, idx2 - idx1):
  92. Z1[k+idx1][j] = Z1[idx1+k-1][j] + roznica
  93. operacje += 1
  94. idx1 = deepcopy(idx2)
  95. idx2 = znajdz_k(Z1[idx1+1:len(x1), j]) + idx1+1
  96. else:
  97. for j in range(len(x1)):
  98. kon = False
  99. idx1 = znajdz_k(Z1[j, 0:len(x1)])
  100. if idx1 != -1:
  101. idx2 = znajdz_k(Z1[j, idx1+1:len(x1)]) + idx1+1
  102. else:
  103. kon = True
  104. while not(kon):
  105. if idx1 == -1 or idx2 == -1 or idx1 == idx2:
  106. kon = True
  107. elif np.abs(idx2-idx1) > przerwa+1 or np.abs(idx2-idx1) == 1:
  108. idx1 = deepcopy(idx2)
  109. idx2 = znajdz_k(Z1[j, idx1 + 1:len(x1)]) + idx1 + 1
  110. else:
  111. roznica = (Z1[j][idx2] - Z1[j][idx1])/(idx2 - idx1)
  112. for k in range(1, idx2 - idx1):
  113. Z1[j][k+idx1] = Z1[j][idx1+k-1] + roznica
  114. operacje += 1
  115. idx1 = deepcopy(idx2)
  116. idx2 = znajdz_k(Z1[j, idx1+1:len(x1)]) + idx1+1
  117. iter += 1
  118. if operacje == 0:
  119. if przerwa < 48:
  120. przerwa += 6
  121. else:
  122. przerwa += 48
  123.  
  124. interx = []
  125. intery = []
  126.  
  127.  
  128. operacje = 1
  129.  
  130.  
  131. while operacje > 0:
  132. operacje = 0
  133. for j in range(1, len(x1)-1):
  134. for i in range(1, len(x1)-1):
  135. if Z1[i][j] == 0:
  136. if Z1[i][j-1] != 0 and Z1[i-1][j] != 0 :
  137. Z1[i][j] = (Z1[i][j-1] + Z1[i-1][j])/2
  138. operacje +=1
  139. elif Z1[i][j-1] != 0 and Z1[i+1][j] != 0 :
  140. Z1[i][j] = (Z1[i][j - 1] + Z1[i + 1][j]) / 2
  141. operacje += 1
  142. elif Z1[i][j + 1] != 0 and Z1[i + 1][j] != 0:
  143. Z1[i][j] = (Z1[i][j + 1] + Z1[i + 1][j]) / 2
  144. operacje += 1
  145. elif Z1[i][j + 1] != 0 and Z1[i - 1][j] != 0:
  146. Z1[i][j] = (Z1[i][j + 1] + Z1[i - 1][j]) / 2
  147. operacje += 1
  148.  
  149. for j in range(1):
  150. for i in range(1, len(x1)-1):
  151. if Z1[i][j] == 0:
  152. Z1[i][j] = Z1[i][j+1]
  153.  
  154. for j in range(417,len(x1)):
  155. for i in range(1, len(x1)-1):
  156. if Z1[i][j] == 0:
  157. Z1[i][j] = Z1[i][j-1]
  158.  
  159. for i in range(len(x1)):
  160. if Z1[0][i] == 0:
  161. Z1[0][i] = Z1[1][i]
  162. if Z1[len(x1)-1][i] == 0:
  163. Z1[len(x1) - 1][i] = Z1[len(x1)-2][i]
  164.  
  165. print(min(z)," ", max(z))
  166. fig = plt.figure()
  167. ax = fig.add_subplot(111, projection='3d')
  168. ax.scatter(x, y, z)
  169.  
  170. ax.plot_surface(X1, Y1, Z1,cmap=cm.coolwarm,
  171. linewidth=0, antialiased=True)
  172.  
  173. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement