Source code for symplyphysics.laws.kinematics.vector.centripetal_acceleration_via_cross_product
r"""
Centripetal acceleration via cross product
==========================================
*Centripetal acceleration* is the acceleration of a body in a rotating coordinate system
which is directed towards the axis of rotation.
Also see :doc:`laws.kinematics.vector.centrifugal_acceleration_via_centripetal_acceleration`.
**Notation:**
#. :math:`\vec a \times \vec b` (:code:`cross(a, b)`) is the cross product between :math:`\vec a` and :math:`\vec b`.
**Links:**
#. `Wikipedia <https://en.wikipedia.org/wiki/Centripetal_force#Derivation_using_vectors>`__.
"""
from sympy import symbols
from symplyphysics import (
units,
angle_type,
validate_input,
validate_output,
Vector,
QuantityVector,
cross_cartesian_vectors,
subtract_cartesian_vectors,
)
from symplyphysics.core.expr_comparisons import expr_equals
from symplyphysics.laws.kinematics.vector import centripetal_acceleration_via_vector_rejection as rejection_law
[docs]
def centripetal_acceleration_law(
angular_velocity_: Vector,
radius_vector_: Vector,
) -> Vector:
r"""
Centripetal acceleration via angular velocity and radius vector.
Law:
:code:`a_c = cross(w, cross(w, r))`
Latex:
.. math::
{\vec a}_\text{c} = \vec \omega \times (\vec \omega \times \vec r)
:param angular_velocity\_: pseudovector of angular velocity
Symbol: :code:`w`
Latex: :math:`\vec \omega`
Dimension: *angle* / *time*
:param radius_vector\_: radius vector, or position vector
Symbol: :code:`r`
Latex: :math:`\vec r`
Dimension: *length*
:return: vector of centripetal acceleration
Symbol: :code:`a_c`
Latex: :math:`{\vec a}_\text{c}`
Dimension: *acceleration*
"""
return cross_cartesian_vectors(
angular_velocity_,
cross_cartesian_vectors(angular_velocity_, radius_vector_),
)
# Prove that it is equivalent to derive centripetal acceleration via cross product
# and via vector rejection.
_angular_velocity = Vector(symbols("angular_velocity_x:z"))
_position_vector = Vector(symbols("position_vector_x:z"))
_cross_product_result = centripetal_acceleration_law(_angular_velocity, _position_vector)
_rejection_result = rejection_law.centripetal_acceleration_law(_angular_velocity, _position_vector)
_difference = subtract_cartesian_vectors(_cross_product_result, _rejection_result).simplify()
for _component in _difference.components:
expr_equals(_component, 0)
@validate_input(
angular_velocity_=angle_type / units.time,
radius_vector_=units.length,
)
@validate_output(units.acceleration)
def calculate_centripetal_acceleration(
angular_velocity_: QuantityVector,
radius_vector_: QuantityVector,
) -> QuantityVector:
vector = centripetal_acceleration_law(
angular_velocity_.to_base_vector(),
radius_vector_.to_base_vector(),
)
return QuantityVector.from_base_vector(vector)