Advertisement
Guest User

Untitled

a guest
Oct 19th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.98 KB | None | 0 0
  1. dim = 2
  2. alpha=0.9 #модуль юнга на сжатие
  3. dalpha=0.1
  4. dt = 1
  5. g = 1
  6.  
  7. class vect:
  8. def __init__ (self, x, y, dim):
  9. self.x = []
  10. self.x.append (x)
  11. self.x.append (y)
  12. self.dim = dim
  13.  
  14. def smult (self, v): #скалярно умножть
  15. r = 0
  16. for i in range (self.dim):
  17. r += self.x[i] * v.x[i]
  18. return r
  19.  
  20. def __getitem__ (self, i):
  21. return self.x[i]
  22.  
  23. def __setitem__ (self, i, val):
  24. self.x[i] = val
  25.  
  26. def __mul__ (self, s):
  27. r = vect (self[0], self[1], self.dim)
  28. for i in range (r.dim):
  29. r[i] = r[i] * s
  30. return r
  31.  
  32. def __add__ (self, v):
  33. r = vect(self[0], self[1], self.dim)
  34. for i in range (r.dim):
  35. r[i] = r[i] + v[i]
  36. return r
  37.  
  38. class sphere:
  39. def __init__ (self, x, y, r, m, idnt):
  40. self.x = vect (x, y, dim)
  41. self.v = vect (0, 0, dim)
  42. self.a = vect (0, 0, dim)
  43. self.r = r
  44. self.m = m
  45. self.idnt = idnt
  46. def distancy(self,b):
  47. r = 0 #расстояние между шариками
  48. for i in range (dim):
  49. r += (self.x[i]-b.x[i])**2
  50. return r ** 0.5
  51. def is_gettin_closer(self,b): #сближаются ли шарики
  52. g=vect((self.x[0]-b.x[0])/self.distancy(b),(self.x[1]-b.x[1])/self.distancy(b),dim)
  53. sosi=g.smult(self.v)-g.smult(b.v)
  54. return (sosi>0)
  55. def force (self, b): #функция силы
  56. r = vect (0, 0, dim)
  57. g=vect((self.x[0]-b.x[0])/self.distancy(b),(self.x[1]-b.x[1])/self.distancy(b),dim)
  58. if(self.distancy(b)>self.r+b.r):
  59. return 0
  60. f=self.r+b.r-self.distancy(b)
  61. f=f*(alpha+self.is_gettin_closer(b)*dalpha)
  62. r[0]=g[0]*f
  63. r[1]=g[1]*f
  64. return r
  65.  
  66. ss = []
  67. for i in range (10):
  68. ss.append(sphere(0, i * 3 + 1, 1, 1, i))
  69. for i in ss:
  70. print (i.x[1])
  71.  
  72. while (True):
  73. for i in ss: #сброс ускорений и учет силы тяжести
  74. i.a[0] = 0
  75. i.a[1] = -g
  76.  
  77. for i in ss: #начало обработки взаимодействий
  78. if i.x[1] - i.r < 0: #взаимодействие с землей
  79. if (i.v[1] < 0 or (i.v[1] == 0 and i.a[1] < 0)):
  80. i.a[1] += (alpha + dalpha) * (i.r - i.x[1])
  81. else:
  82. i.a[1] += alpha * (i.r - i.x[1])
  83.  
  84. for j in ss: #взаимодействие с другими шариками
  85. if i.idnt == j.idnt: #сам с собой не взаимодействует
  86. continue
  87. f = force (i, j) #функция, определяющая силу, с которой шарик j воздействует на шарик i
  88. i.a = i.a + f * (1 / i.m) #конец обработки взаимодействий
  89.  
  90. for i in ss: #обработка перемещений и изменения скоростей
  91. for z in range (dim):
  92. i.x[z] += i.v[z]*dt + 0.5 * dt * dt * i.a[z]
  93. i.v[z] += i.a[z]
  94. break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement