Spaces:
Sleeping
Sleeping
from sympy import S | |
from sympy.physics.vector import cross, dot | |
from sympy.physics.mechanics.body_base import BodyBase | |
from sympy.physics.mechanics.inertia import inertia_of_point_mass | |
from sympy.utilities.exceptions import sympy_deprecation_warning | |
__all__ = ['Particle'] | |
class Particle(BodyBase): | |
"""A particle. | |
Explanation | |
=========== | |
Particles have a non-zero mass and lack spatial extension; they take up no | |
space. | |
Values need to be supplied on initialization, but can be changed later. | |
Parameters | |
========== | |
name : str | |
Name of particle | |
point : Point | |
A physics/mechanics Point which represents the position, velocity, and | |
acceleration of this Particle | |
mass : Sympifyable | |
A SymPy expression representing the Particle's mass | |
potential_energy : Sympifyable | |
The potential energy of the Particle. | |
Examples | |
======== | |
>>> from sympy.physics.mechanics import Particle, Point | |
>>> from sympy import Symbol | |
>>> po = Point('po') | |
>>> m = Symbol('m') | |
>>> pa = Particle('pa', po, m) | |
>>> # Or you could change these later | |
>>> pa.mass = m | |
>>> pa.point = po | |
""" | |
point = BodyBase.masscenter | |
def __init__(self, name, point=None, mass=None): | |
super().__init__(name, point, mass) | |
def linear_momentum(self, frame): | |
"""Linear momentum of the particle. | |
Explanation | |
=========== | |
The linear momentum L, of a particle P, with respect to frame N is | |
given by: | |
L = m * v | |
where m is the mass of the particle, and v is the velocity of the | |
particle in the frame N. | |
Parameters | |
========== | |
frame : ReferenceFrame | |
The frame in which linear momentum is desired. | |
Examples | |
======== | |
>>> from sympy.physics.mechanics import Particle, Point, ReferenceFrame | |
>>> from sympy.physics.mechanics import dynamicsymbols | |
>>> from sympy.physics.vector import init_vprinting | |
>>> init_vprinting(pretty_print=False) | |
>>> m, v = dynamicsymbols('m v') | |
>>> N = ReferenceFrame('N') | |
>>> P = Point('P') | |
>>> A = Particle('A', P, m) | |
>>> P.set_vel(N, v * N.x) | |
>>> A.linear_momentum(N) | |
m*v*N.x | |
""" | |
return self.mass * self.point.vel(frame) | |
def angular_momentum(self, point, frame): | |
"""Angular momentum of the particle about the point. | |
Explanation | |
=========== | |
The angular momentum H, about some point O of a particle, P, is given | |
by: | |
``H = cross(r, m * v)`` | |
where r is the position vector from point O to the particle P, m is | |
the mass of the particle, and v is the velocity of the particle in | |
the inertial frame, N. | |
Parameters | |
========== | |
point : Point | |
The point about which angular momentum of the particle is desired. | |
frame : ReferenceFrame | |
The frame in which angular momentum is desired. | |
Examples | |
======== | |
>>> from sympy.physics.mechanics import Particle, Point, ReferenceFrame | |
>>> from sympy.physics.mechanics import dynamicsymbols | |
>>> from sympy.physics.vector import init_vprinting | |
>>> init_vprinting(pretty_print=False) | |
>>> m, v, r = dynamicsymbols('m v r') | |
>>> N = ReferenceFrame('N') | |
>>> O = Point('O') | |
>>> A = O.locatenew('A', r * N.x) | |
>>> P = Particle('P', A, m) | |
>>> P.point.set_vel(N, v * N.y) | |
>>> P.angular_momentum(O, N) | |
m*r*v*N.z | |
""" | |
return cross(self.point.pos_from(point), | |
self.mass * self.point.vel(frame)) | |
def kinetic_energy(self, frame): | |
"""Kinetic energy of the particle. | |
Explanation | |
=========== | |
The kinetic energy, T, of a particle, P, is given by: | |
``T = 1/2 (dot(m * v, v))`` | |
where m is the mass of particle P, and v is the velocity of the | |
particle in the supplied ReferenceFrame. | |
Parameters | |
========== | |
frame : ReferenceFrame | |
The Particle's velocity is typically defined with respect to | |
an inertial frame but any relevant frame in which the velocity is | |
known can be supplied. | |
Examples | |
======== | |
>>> from sympy.physics.mechanics import Particle, Point, ReferenceFrame | |
>>> from sympy import symbols | |
>>> m, v, r = symbols('m v r') | |
>>> N = ReferenceFrame('N') | |
>>> O = Point('O') | |
>>> P = Particle('P', O, m) | |
>>> P.point.set_vel(N, v * N.y) | |
>>> P.kinetic_energy(N) | |
m*v**2/2 | |
""" | |
return S.Half * self.mass * dot(self.point.vel(frame), | |
self.point.vel(frame)) | |
def set_potential_energy(self, scalar): | |
sympy_deprecation_warning( | |
""" | |
The sympy.physics.mechanics.Particle.set_potential_energy() | |
method is deprecated. Instead use | |
P.potential_energy = scalar | |
""", | |
deprecated_since_version="1.5", | |
active_deprecations_target="deprecated-set-potential-energy", | |
) | |
self.potential_energy = scalar | |
def parallel_axis(self, point, frame): | |
"""Returns an inertia dyadic of the particle with respect to another | |
point and frame. | |
Parameters | |
========== | |
point : sympy.physics.vector.Point | |
The point to express the inertia dyadic about. | |
frame : sympy.physics.vector.ReferenceFrame | |
The reference frame used to construct the dyadic. | |
Returns | |
======= | |
inertia : sympy.physics.vector.Dyadic | |
The inertia dyadic of the particle expressed about the provided | |
point and frame. | |
""" | |
return inertia_of_point_mass(self.mass, self.point.pos_from(point), | |
frame) | |