рдЕрдЬрдЧрд░ + matplotlib рдореЗрдВ рдХрд╕реНрдЯрдо рд╢рд╛рд░реАрд░рд┐рдХ рдмрд╛рддрдЪреАрдд рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЕрдиреБрдХрд░рдг

рдирдорд╕реНрддреЗ!

рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЗ рдХрд╛рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдХреБрдЫ рд╕реБрдВрджрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ)ред



рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛:

  1. рд╣рдо рдЖрдзрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдЬреЛ рд╣рд╛рде рдкрд░ рд╕реБрдиреНрди рдирд╣реАрдВ рд╣реИ)
  2. рд╣рдо рдмрд╛рддрдЪреАрдд рдХреЗ рднреМрддрд┐рдХ рдмрд┐рдВрджреБ рдФрд░ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ

рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ (рд╕рд╛рдорд╛рдиреНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд):

  1. рдЖрдЗрдП рд╡рд┐рджреНрдпреБрдд рдЪреБрдореНрдмрдХреАрдп рдХреНрд╖реЗрддреНрд░ рд╢рдХреНрддрд┐ (рдкрд╣рд▓реЗ рдФрд░ рддреАрд╕рд░реЗ рдЪрд┐рддреНрд░) рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдПрдВ
  2. рд╣рдо рдПрдХ рд╡рд┐рджреНрдпреБрдд рдЪреБрдореНрдмрдХреАрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрдгреЛрдВ рдХреА рдЧрддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВрдЧреЗ

рдХрдЯ рдХреЗ рдиреАрдЪреЗ рдореБрдЭрд╕реЗ рдорд┐рд▓реЛ!

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ


рд╡реЗрдХреНрдЯрд░


рд╕рднреА рдиреАрдВрд╡реЛрдВ рдХрд╛ рдЖрдзрд╛рд░ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ)ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╣реИ рдЬреЛ рд╣рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП? рдПрдХ рд╡реЗрдХреНрдЯрд░, рджреВрд░реА, рдореЙрдбреНрдпреВрд▓ рдФрд░ рддрдХрдиреАрдХреА рдЪреАрдЬреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдкрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рдиред рд╡реЗрдХреНрдЯрд░ рд╣рдо рд╕реВрдЪреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХрд╛ рдЖрд░рдореНрднрд┐рдХ рд░реВрдк рджрд┐рдЦрддрд╛ рд╣реИ:

class Vector(list): def __init__(self, *el): for e in el: self.append(e) 

рдпрд╣реА рд╣реИ, рдЕрдм рд╣рдо рдПрдХ рд╡реЗрдХреНрдЯрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

 v = Vector(1, 2, 3) 

рдЖрдЗрдП рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВ:

 class Vector(list): ... def __add__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] + other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self + other 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛:

 v1 = Vector(1, 2, 3) v2 = Vector(2, 57, 23.2) v1 + v2 >>> [3, 59, 26.2] 

рд╣рдо рдЗрд╕реА рддрд░рд╣ рд╕рднреА рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдкреВрд░реНрдг рдХреЛрдб рдХрдо рд╣реЛрдЧрд╛)ред рдЕрдм рдЖрдкрдХреЛ рджреВрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рджреЗрд╣рд╛рддреА рдбрд┐рд╕реНрдЯрд░реНрдм (v1, v2) рдмрдирд╛ рд╕рдХрддрд╛ рдерд╛ - рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП% рдСрдкрд░реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

 class Vector(list): ... def __mod__(self, other): return sum((self - other) ** 2) ** 0.5 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛:

 v1 = Vector(1, 2, 3) v2 = Vector(2, 57, 23.2) v1 % v2 >>> 58.60068258988115 

рд╣рдореЗрдВ рддреЗрдЬ рд╡реЗрдХреНрдЯрд░ рдкреАрдврд╝реА рдФрд░ рд╕реБрдВрджрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреБрдЫ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдБ рд╡реЗрдХреНрдЯрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рд╣реИ:

рд╕рднреА рд╡реЗрдХреНрдЯрд░ рдХреНрд▓рд╛рд╕ рдХреЛрдб
 class Vector(list): def __init__(self, *el): for e in el: self.append(e) def __add__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] + other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self + other def __sub__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] - other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self - other def __mul__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] * other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self * other def __truediv__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] / other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self / other def __pow__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] ** other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self ** other def __mod__(self, other): return sum((self - other) ** 2) ** 0.5 def mod(self): return self % Vector.emptyvec(len(self)) def dim(self): return len(self) def __str__(self): if len(self) == 0: return "Empty" r = [str(i) for i in self] return "< " + " ".join(r) + " >" def _ipython_display_(self): print(str(self)) @staticmethod def emptyvec(lens=2, n=0): return Vector(*[n for i in range(lens)]) @staticmethod def randvec(dim): return Vector(*[random.random() for i in range(dim)]) 


рд╕рд╛рдордЧреНрд░реА рдмрд┐рдВрджреБ


рдпрд╣рд╛рдБ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдмрд┐рдВрджреБ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдЧрддрд┐ рдФрд░ рддреНрд╡рд░рдг рд╣реИ (рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рджреНрд░рд╡реНрдпрдорд╛рди рдФрд░ рдХрд╕реНрдЯрдо рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рджреНрдпреБрдд рдЪреБрдореНрдмрдХреАрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реБрд▓реНрдХ рд╣рдореЗрдВ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рд╕реНрдкрд┐рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред

рдкреНрд░рд╛рд░рдВрдн рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

 class Point: def __init__(self, coords, mass=1.0, q=1.0 speed=None, **properties): self.coords = coords if speed is None: self.speed = Vector(*[0 for i in range(len(coords))]) else: self.speed = speed self.acc = Vector(*[0 for i in range(len(coords))]) self.mass = mass self.__params__ = ["coords", "speed", "acc", "q"] + list(properties.keys()) self.q = q for prop in properties: setattr(self, prop, properties[prop]) 

рдФрд░ рдЕрдкрдиреА рдмрд╛рдд рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдФрд░ рдЧрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд▓рд┐рдЦреЗрдВрдЧреЗ:

 class Point: ... def move(self, dt): self.coords = self.coords + self.speed * dt def accelerate(self, dt): self.speed = self.speed + self.acc * dt def accinc(self, force): #        self.acc = self.acc + force / self.mass def clean_acc(self): self.acc = self.acc * 0 

рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛, рдмрд┐рдВрджреБ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд╡рд╛рдЗрдВрдЯ рдХреЛрдб (рдЕрдЪреНрдЫреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде)
 class Point: def __init__(self, coords, mass=1.0, q=1.0 speed=None, **properties): self.coords = coords if speed is None: self.speed = Vector(*[0 for i in range(len(coords))]) else: self.speed = speed self.acc = Vector(*[0 for i in range(len(coords))]) self.mass = mass self.__params__ = ["coords", "speed", "acc", "q"] + list(properties.keys()) self.q = q for prop in properties: setattr(self, prop, properties[prop]) def move(self, dt): self.coords = self.coords + self.speed * dt def accelerate(self, dt): self.speed = self.speed + self.acc * dt def accinc(self, force): self.acc = self.acc + force / self.mass def clean_acc(self): self.acc = self.acc * 0 def __str__(self): r = ["Point {"] for p in self.__params__: r.append(" " + p + " = " + str(getattr(self, p))) r += ["}"] return "\n".join(r) def _ipython_display_(self): print(str(self)) 

рдкрд░рд┐рдгрд╛рдо:


рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреНрд╖реЗрддреНрд░


рд╣рдо рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рднреМрддрд┐рдХ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╕реЗрдЯ рдФрд░ рдЙрди рдкрд░ рдмрд▓ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдЕрджреНрднреБрдд рдмреНрд░рд╣реНрдорд╛рдВрдб рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╕реНрдЯрдо рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╣реЛрдЧрд╛ (рдмреЗрд╢рдХ, рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ)ред рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдмрд┐рдВрджреБ рдЬреЛрдбрд╝реЗрдВ:

 class InteractionField: def __init__(self, F): # F -   , F(p1, p2, r), p1, p2 - , r -    self.points = [] self.F = F def append(self, *args, **kwargs): self.points.append(Point(*args, **kwargs)) 

рдЕрдм рдордЬрд╝реЗ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ "рддрдирд╛рд╡" рд▓реМрдЯрд╛рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЛрдореИрдЧреНрдиреЗрдЯрд┐рдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХреБрдЫ рдЕрдореВрд░реНрдд рд╡реЗрдХреНрдЯрд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдмрд┐рдВрджреБ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд┐рдВрджреБ q рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реЛрдЧреА, рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ - рдмрд┐рдВрджреБ рдХрд╛ рдкреНрд░рднрд╛рд░ (рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ - рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡реЗрдХреНрдЯрд░ рднреА)ред рддреЛ рдмрд┐рдВрджреБ C рдкрд░ рддрдирд╛рд╡ рдХреНрдпрд╛ рд╣реИ? рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

 vecE( vecC)= sum vecFi( vecC)



рдпрд╛рдиреА рдмрд┐рдВрджреБ рдкрд░ рддрдирд╛рд╡  vecCрдХреБрдЫ рдЗрдХрд╛рдИ рдмрд┐рдВрджреБ рдкрд░ рдЕрднрд┐рдирдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд▓реЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рдмрд░рд╛рдмрд░ред

 class InteractionField: ... def intensity(self, coord): proj = Vector(*[0 for i in range(coord.dim())]) single_point = Point(Vector(), mass=1.0, q=1.0) #       (   ,       F,      ) for p in self.points: if coord % p.coords < 10 ** (-10): #      ,        ,   ,     (  ) continue d = p.coords % coord fmod = self.F(single_point, p, d) * (-1) #    -  proj = proj + (coord - p.coords) / d * fmod #  return proj 

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡реЗрдХреНрдЯрд░ рдлрд╝реАрд▓реНрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдЕрдВрдд рдореЗрдВ рдХрд░реЗрдВрдЧреЗред рдЕрдм рд╣рдо рдЕрдкрдиреА рдмрд╛рддрдЪреАрдд рдореЗрдВ рдПрдХ рдХрджрдо рдЙрдард╛рддреЗ рд╣реИрдВ

 class InteractionField: ... def step(self, dt): self.clean_acc() for p in self.points: p.accinc(self.intensity(p.coords) * pq) p.accelerate(dt) p.move(dt) 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рддрдирд╛рд╡ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ ETU рд╕рд╛рдордЧреНрд░реА рдмрд┐рдВрджреБ рдкрд░ рдЕрдВрддрд┐рдо рдмрд▓ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 vecF= vecEтИЧq



рд▓рд╛рдкрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред

рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рдирдлрд┐рд▓реНрдб рдХреЛрдб
 class InteractionField: def __init__(self, F): self.points = [] self.F = F def move_all(self, dt): for p in self.points: p.move(dt) def intensity(self, coord): proj = Vector(*[0 for i in range(coord.dim())]) single_point = Point(Vector(), mass=1.0, q=1.0) for p in self.points: if coord % p.coords < 10 ** (-10): continue d = p.coords % coord fmod = self.F(single_point, p, d) * (-1) proj = proj + (coord - p.coords) / d * fmod return proj def step(self, dt): self.clean_acc() for p in self.points: p.accinc(self.intensity(p.coords) * pq) p.accelerate(dt) p.move(dt) def clean_acc(self): for p in self.points: p.clean_acc() def append(self, *args, **kwargs): self.points.append(Point(*args, **kwargs)) def gather_coords(self): return [p.coords for p in self.points] 


рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ред рдХрдг рдЖрдВрджреЛрд▓рди рдФрд░ рд╡реЗрдХреНрдЯрд░ рдХреНрд╖реЗрддреНрд░ рджреГрд╢реНрдп


рддреЛ рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЧрдПред рдЖрдЗрдП рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ ...

рдПрдХ рд╡рд┐рджреНрдпреБрдд рдЪреБрдореНрдмрдХреАрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрдгреЛрдВ рдХреА рдЧрддрд┐ рдореЙрдбрд▓рд┐рдВрдЧ


 u = InteractionField(lambda p1, p2, r: 300000 * -p1.q * p2.q / (r ** 2 + 0.1)) for i in range(3): u.append(Vector.randvec(2) * 10, q=random.random() - 0.5) 

рджрд░рдЕрд╕рд▓, рдЧреБрдгрд╛рдВрдХ k рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд┐рд▓рд┐рдпрди (9 * 10 ^ (- 9)) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рдордп t -> 0 рд╕реЗ рдмреБрдЭ рдЬрд╛рдПрдЧрд╛, рдореИрдВрдиреЗ рддреБрд░рдВрдд рджреЛрдиреЛрдВ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рднреМрддрд┐рдХреА рдореЗрдВ k = 300'000ред рдФрд░ рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдЖрд░ ** 2 + 0.1

- рдпрд╣ 0. рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдбрд┐рдлреЙрд░реНрдореНрд╕ рдХреА рдПрдХ рдмрдбрд╝реА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ 2 рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧрддрд┐ рдХрд╛ рдХреЛрдИ рд╕рдореАрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдпрд╣ "рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП" рд▓реЗрдЦ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде 0 рд╕реЗ 10 рддрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рджрд╕ рдЕрдВрдХ (2-рдЖрдпрд╛рдореА рд╕реНрдерд╛рди) рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЛ -0.25 рд╕реЗ 0.25 рддрдХ рдЪрд╛рд░реНрдЬ рджреЗрддреЗ рд╣реИрдВред рдЕрдм рдЙрдирдХреЗ рд╕рдордиреНрд╡рдп (рдФрд░ рдирд┐рд╢рд╛рди) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд▓реВрдк рдмрдирд╛рдПрдВ рдФрд░ рдЕрдВрдХ рдмрдирд╛рдПрдВ:

 X, Y = [], [] for i in range(130): u.step(0.0006) xd, yd = zip(*u.gather_coords()) X.extend(xd) Y.extend(yd) plt.figure(figsize=[8, 8]) plt.scatter(X, Y) plt.scatter(*zip(*u.gather_coords()), color="orange") plt.show() 

рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛:



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╣рд╛рдВ рдбреНрд░рд╛рдЗрдВрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХреНрд╖рдг рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИред

рд╡реЗрдХреНрдЯрд░ рдлрд╝реАрд▓реНрдб рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рд╣рдореЗрдВ рдХреБрдЫ рдХрджрдо рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 fig = plt.figure(figsize=[5, 5]) res = [] STEP = 0.3 for x in np.arange(0, 10, STEP): for y in np.arange(0, 10, STEP): inten = u.intensity(Vector(x, y)) F = inten.mod() inten /= inten.mod() * 4 #     res.append(([x - inten[0] / 2, x + inten[0] / 2], [y - inten[1] / 2, y + inten[1] / 2], F)) for r in res: plt.plot(r[0], r[1], color=(sigm(r[2]), 0.1, 0.8 * (1 - sigm(r[2])))) #        plt.show() 

рд▓рдЧрднрдЧ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред



рдЖрдк рд╕реНрд╡рдпрдВ рд╡реИрдХреНрдЯрд░ рдХреЛ рд▓рдВрдмрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, * 4 рдХреЛ 1.5 * рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:



рд╣рдо рдЖрдпрд╛рдореАрддрд╛ рдФрд░ рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ


200 рдЕрдВрдХреЛрдВ рдФрд░ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкрд╛рдВрдЪ рдЖрдпрд╛рдореА рд╕реНрдерд╛рди рдмрдирд╛рдПрдВ рдЬреЛ рджреВрд░реА рдХреЗ рд╡рд░реНрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди 4 рдбрд┐рдЧреНрд░реА рдкрд░ред

 u = InteractionField(lambda p1, p2, r: 300000 * -p1.q * p2.q / (r ** 4 + 0.1)) for i in range(200): u.append(Vector.randvec(5) * 10, q=random.random() - 0.5) 

рдЕрдм рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдЧрддрд┐ рдЖрджрд┐ рдХреЛ рдкрд╛рдВрдЪ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдХреБрдЫ рдореЙрдбрд▓ рдХрд░рддреЗ рд╣реИрдВ:

 velmod = 0 velocities = [] for i in range(100): u.step(0.0005) velmod = sum([p.speed.mod() for p in u.points]) #       velocities.append(velmod) plt.plot(velocities) plt.show() 



рдпрд╣ рдХрд┐рд╕реА рднреА рд╕рдордп рд╕рднреА рдЧрддрд┐ рдХреЗ рдпреЛрдЧ рдХрд╛ рдПрдХ рдЧреНрд░рд╛рдл рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдордп рдХреЗ рд╕рд╛рде рд╡реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рддреЗрдЬ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред

рдЦреИрд░, рдпрд╣ рдПрдХ рд╕рд░рд▓ рдирд┐рд░реНрджреЗрд╢ рдерд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЪреАрдЬ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдПред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдлреВрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:


рдбреЗрдореЛ рдХреЗ рд╕рд╛рде рд╕рднреА рдХреЛрдб
 import random class Vector(list): def __init__(self, *el): for e in el: self.append(e) def __add__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] + other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self + other def __sub__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] - other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self - other def __mul__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] * other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self * other def __truediv__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] / other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self / other def __pow__(self, other): if type(other) is Vector: assert len(self) == len(other), "Error 0" r = Vector() for i in range(len(self)): r.append(self[i] ** other[i]) return r else: other = Vector.emptyvec(lens=len(self), n=other) return self ** other def __mod__(self, other): return sum((self - other) ** 2) ** 0.5 def mod(self): return self % Vector.emptyvec(len(self)) def dim(self): return len(self) def __str__(self): if len(self) == 0: return "Empty" r = [str(i) for i in self] return "< " + " ".join(r) + " >" def _ipython_display_(self): print(str(self)) @staticmethod def emptyvec(lens=2, n=0): return Vector(*[n for i in range(lens)]) @staticmethod def randvec(dim): return Vector(*[random.random() for i in range(dim)]) class Point: def __init__(self, coords, mass=1.0, q=1.0, speed=None, **properties): self.coords = coords if speed is None: self.speed = Vector(*[0 for i in range(len(coords))]) else: self.speed = speed self.acc = Vector(*[0 for i in range(len(coords))]) self.mass = mass self.__params__ = ["coords", "speed", "acc", "q"] + list(properties.keys()) self.q = q for prop in properties: setattr(self, prop, properties[prop]) def move(self, dt): self.coords = self.coords + self.speed * dt def accelerate(self, dt): self.speed = self.speed + self.acc * dt def accinc(self, force): self.acc = self.acc + force / self.mass def clean_acc(self): self.acc = self.acc * 0 def __str__(self): r = ["Point {"] for p in self.__params__: r.append(" " + p + " = " + str(getattr(self, p))) r += ["}"] return "\n".join(r) def _ipython_display_(self): print(str(self)) class InteractionField: def __init__(self, F): self.points = [] self.F = F def move_all(self, dt): for p in self.points: p.move(dt) def intensity(self, coord): proj = Vector(*[0 for i in range(coord.dim())]) single_point = Point(Vector(), mass=1.0, q=1.0) for p in self.points: if coord % p.coords < 10 ** (-10): continue d = p.coords % coord fmod = self.F(single_point, p, d) * (-1) proj = proj + (coord - p.coords) / d * fmod return proj def step(self, dt): self.clean_acc() for p in self.points: p.accinc(self.intensity(p.coords) * pq) p.accelerate(dt) p.move(dt) def clean_acc(self): for p in self.points: p.clean_acc() def append(self, *args, **kwargs): self.points.append(Point(*args, **kwargs)) def gather_coords(self): return [p.coords for p in self.points] #  import matplotlib.pyplot as plt import numpy as np import time #     if False: u = InteractionField(lambda p1, p2, r: 300000 * -p1.q * p2.q / (r ** 2 + 0.1)) for i in range(10): u.append(Vector.randvec(2) * 10, q=(random.random() - 0.5) / 2) X, Y = [], [] for i in range(130): u.step(0.0006) xd, yd = zip(*u.gather_coords()) X.extend(xd) Y.extend(yd) plt.figure(figsize=[8, 8]) plt.scatter(X, Y) plt.scatter(*zip(*u.gather_coords()), color="orange") plt.show() def sigm(x): return 1 / (1 + 1.10 ** (-x/1000)) #    if False: u = InteractionField(lambda p1, p2, r: 300000 * -p1.q * p2.q / (r ** 2 + 0.1)) for i in range(3): u.append(Vector.randvec(2) * 10, q=random.random() - 0.5) fig = plt.figure(figsize=[5, 5]) res = [] STEP = 0.3 for x in np.arange(0, 10, STEP): for y in np.arange(0, 10, STEP): inten = u.intensity(Vector(x, y)) F = inten.mod() inten /= inten.mod() * 1.5 res.append(([x - inten[0] / 2, x + inten[0] / 2], [y - inten[1] / 2, y + inten[1] / 2], F)) for r in res: plt.plot(r[0], r[1], color=(sigm(r[2]), 0.1, 0.8 * (1 - sigm(r[2])))) plt.show() #    5-  if False: u = InteractionField(lambda p1, p2, r: 300000 * -p1.q * p2.q / (r ** 4 + 0.1)) for i in range(200): u.append(Vector.randvec(5) * 10, q=random.random() - 0.5) velmod = 0 velocities = [] for i in range(100): u.step(0.0005) velmod = sum([p.speed.mod() for p in u.points]) velocities.append(velmod) plt.plot(velocities) plt.show() 


рдЕрдЧрд▓рд╛ рд▓реЗрдЦ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛, рдФрд░ рд╢рд╛рдпрдж рддрд░рд▓ рдкрджрд╛рд░реНрде рдФрд░ рдирд╡рд┐рдпрд░-рд╕реНрдЯреЛрдХреНрд╕ рд╕рдореАрдХрд░рдгред
UPD: рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рд▓реЗрдЦ

рд╡реАрдбрд┐рдпреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЛрдореЛрджреЗрд╡ рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/hi467803/


All Articles