Skip to content

Add implementation of Coulomb's Law #4897

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 22, 2021
Merged
Changes from all commits
Commits
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
86 changes: 86 additions & 0 deletions electronics/coulombs_law.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# https://en.wikipedia.org/wiki/Coulomb%27s_law

from __future__ import annotations

COULOMBS_CONSTANT = 8.988e9 # units = N * m^s * C^-2


def couloumbs_law(
force: float, charge1: float, charge2: float, distance: float
) -> dict[str, float]:

"""
Apply Coulomb's Law on any three given values. These can be force, charge1,
charge2, or distance, and then in a Python dict return name/value pair of
the zero value.

Coulomb's Law states that the magnitude of the electrostatic force of
attraction or repulsion between two point charges is directly proportional
to the product of the magnitudes of charges and inversely proportional to
the square of the distance between them.

Reference
----------
Coulomb (1785) "Premier mémoire sur l’électricité et le magnétisme,"
Histoire de l’Académie Royale des Sciences, pp. 569–577.

Parameters
----------
force : float with units in Newtons

charge1 : float with units in Coulombs

charge2 : float with units in Coulombs

distance : float with units in meters

Returns
-------
result : dict name/value pair of the zero value

>>> couloumbs_law(force=0, charge1=3, charge2=5, distance=2000)
{'force': 33705.0}

>>> couloumbs_law(force=10, charge1=3, charge2=5, distance=0)
{'distance': 116112.01488218177}

>>> couloumbs_law(force=10, charge1=0, charge2=5, distance=2000)
{'charge1': 0.0008900756564307966}

>>> couloumbs_law(force=0, charge1=0, charge2=5, distance=2000)
Traceback (most recent call last):
...
ValueError: One and only one argument must be 0

>>> couloumbs_law(force=0, charge1=3, charge2=5, distance=-2000)
Traceback (most recent call last):
...
ValueError: Distance cannot be negative

"""

charge_product = abs(charge1 * charge2)

if (force, charge1, charge2, distance).count(0) != 1:
raise ValueError("One and only one argument must be 0")
if distance < 0:
raise ValueError("Distance cannot be negative")
if force == 0:
force = COULOMBS_CONSTANT * charge_product / (distance ** 2)
return {"force": force}
elif charge1 == 0:
charge1 = abs(force) * (distance ** 2) / (COULOMBS_CONSTANT * charge2)
return {"charge1": charge1}
elif charge2 == 0:
charge2 = abs(force) * (distance ** 2) / (COULOMBS_CONSTANT * charge1)
return {"charge2": charge2}
elif distance == 0:
distance = (COULOMBS_CONSTANT * charge_product / abs(force)) ** 0.5
return {"distance": distance}
raise ValueError("Exactly one argument must be 0")


if __name__ == "__main__":
import doctest

doctest.testmod()