Source code for symplyphysics.laws.kinematics.vector.acceleration_is_normal_plus_tangential_acceleration
"""
Acceleration is normal plus tangential acceleration
===================================================
The acceleration of a body moving arbitrarily is composed of two parts:
#. *normal, or centripetal, acceleration*, which is always present in a rotating environment
and points to the instantaneous axis of rotation,
#. and *tangential acceleration*, which is responsible for the change in the magnitude of
the velocity vector.
**Links:**
#. `Wikipedia <https://en.wikipedia.org/wiki/Circular_motion#Formula>`__.
#. `Mathematica LibreTexts <https://math.libretexts.org/Bookshelves/Calculus/Supplemental_Modules_(Calculus)/Vector_Calculus/2%3A_Vector-Valued_Functions_and_Motion_in_Space/2.6%3A_Tangential_and_Normal_Components_of_Acceleration>`__.
"""
from pytest import approx
from symplyphysics import (
Quantity,
dot_vectors,
units,
validate_input,
validate_output,
Vector,
QuantityVector,
add_cartesian_vectors,
scale_vector,
)
[docs]
def acceleration_law(
normal_acceleration_: Vector,
tangential_acceleration_: Vector,
) -> Vector:
r"""
Total acceleration via normal and tangential accelerations.
Law:
:code:`a = a_n + a_t`
Latex:
.. math::
\vec a = {\vec a}_n + {\vec a}_\tau
:param normal_acceleration\_: vector of normal acceleration
Symbol: :code:`a_n`
Latex: :math:`{\vec a}_n`
Dimension: *acceleration*
:param tangential_acceleration\_: vector of tangential acceleration
Symbol: :code:`a_t`
Latex: :math:`{\vec a}_\tau`
Dimension: *acceleration*
:return: vector of total acceleration
Symbol: :code:`a`
Latex: :math:`\vec a`
Dimension: *acceleration*
"""
return add_cartesian_vectors(normal_acceleration_, tangential_acceleration_)
[docs]
def normal_acceleration_law(
total_acceleration_: Vector,
tangential_acceleration_: Vector,
) -> Vector:
r"""
Normal acceleration via total and tangential accelerations.
Law:
:code:`a_n = a - a_t`
Latex:
.. math::
{\vec a}_n = \vec a - {\vec a}_\tau
:param total_acceleration\_: vector of total acceleration
Symbol: :code:`a`
Latex: :math:`\vec a`
Dimension: *acceleration*
:param tangential_acceleration\_: vector of tangential acceleration
Symbol: :code:`a_t`
Latex: :math:`{\vec a}_\tau`
Dimension: *acceleration*
"""
opposite_tangential_vector = scale_vector(-1, tangential_acceleration_)
return add_cartesian_vectors(total_acceleration_, opposite_tangential_vector)
[docs]
def tangential_acceleration_law(
total_acceleration_: Vector,
normal_acceleration_: Vector,
) -> Vector:
r"""
Tangential acceleration via total and normal accelerations.
Law:
:code:`a_t = a - a_n`
Latex:
.. math::
{\vec a}_\tau = \vec a - {\vec a}_n
:param total_acceleration\_: vector of total acceleration
Symbol: :code:`a`
Latex: :math:`\vec a`
Dimension: *acceleration*
:param normal_acceleration\_: vector of normal acceleration
Symbol: :code:`a_n`
Latex: :math:`{\vec a}_n`
Dimension: *acceleration*
"""
opposite_radial_vector = scale_vector(-1, normal_acceleration_)
return add_cartesian_vectors(total_acceleration_, opposite_radial_vector)
@validate_input(
normal_acceleration_=units.acceleration,
tangential_acceleration_=units.acceleration,
)
@validate_output(units.acceleration)
def calculate_acceleration(
normal_acceleration_: QuantityVector,
tangential_acceleration_: QuantityVector,
) -> QuantityVector:
radial_acceleration_vector = normal_acceleration_.to_base_vector()
tangential_acceleration_vector = tangential_acceleration_.to_base_vector()
dot_vectors_result = Quantity(
dot_vectors(radial_acceleration_vector, tangential_acceleration_vector))
if dot_vectors_result.scale_factor != approx(0.0, rel=1e-3):
raise ValueError(
"Radial and tangential acceleration vectors should be perpendicular to each other")
acceleration_vector = acceleration_law(
radial_acceleration_vector,
tangential_acceleration_vector,
)
return QuantityVector.from_base_vector(acceleration_vector)
@validate_input(
total_acceleration_=units.acceleration,
tangential_acceleration_=units.acceleration,
)
@validate_output(units.acceleration)
def calculate_radial_acceleration(
total_acceleration_: QuantityVector,
tangential_acceleration_: QuantityVector,
) -> QuantityVector:
total_acceleration_vector = total_acceleration_.to_base_vector()
tangential_acceleration_vector = tangential_acceleration_.to_base_vector()
radial_acceleration_vector = normal_acceleration_law(
total_acceleration_vector,
tangential_acceleration_vector,
)
return QuantityVector.from_base_vector(radial_acceleration_vector)
@validate_input(
total_acceleration_=units.acceleration,
normal_acceleration_=units.acceleration,
)
@validate_output(units.acceleration)
def calculate_tangential_acceleration(
total_acceleration_: QuantityVector,
normal_acceleration_: QuantityVector,
) -> QuantityVector:
total_acceleration_vector = total_acceleration_.to_base_vector()
radial_acceleration_vector = normal_acceleration_.to_base_vector()
tangential_acceleration_vector = tangential_acceleration_law(
total_acceleration_vector,
radial_acceleration_vector,
)
return QuantityVector.from_base_vector(tangential_acceleration_vector)