Skip to content

Commit e5a6a97

Browse files
san-jay-14pre-commit-ci[bot]tianyizheng02
authored
Added Lens formulae to the Physics repository (TheAlgorithms#10187)
* Added Lens formulae to the Physics repository * Resolved the commented issues * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update lens_formulae.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Tianyi Zheng <[email protected]>
1 parent dd7d18d commit e5a6a97

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed

physics/lens_formulae.py

+131
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
"""
2+
This module has functions which calculate focal length of lens, distance of
3+
image from the lens and distance of object from the lens.
4+
The above is calculated using the lens formula.
5+
6+
In optics, the relationship between the distance of the image (v),
7+
the distance of the object (u), and
8+
the focal length (f) of the lens is given by the formula known as the Lens formula.
9+
The Lens formula is applicable for convex as well as concave lenses. The formula
10+
is given as follows:
11+
12+
-------------------
13+
| 1/f = 1/v + 1/u |
14+
-------------------
15+
16+
Where
17+
f = focal length of the lens in meters.
18+
v = distance of the image from the lens in meters.
19+
u = distance of the object from the lens in meters.
20+
21+
To make our calculations easy few assumptions are made while deriving the formula
22+
which are important to keep in mind before solving this equation.
23+
The assumptions are as follows:
24+
1. The object O is a point object lying somewhere on the principle axis.
25+
2. The lens is thin.
26+
3. The aperture of the lens taken must be small.
27+
4. The angles of incidence and angle of refraction should be small.
28+
29+
Sign convention is a set of rules to set signs for image distance, object distance,
30+
focal length, etc
31+
for mathematical analysis of image formation. According to it:
32+
1. Object is always placed to the left of lens.
33+
2. All distances are measured from the optical centre of the mirror.
34+
3. Distances measured in the direction of the incident ray are positive and
35+
the distances measured in the direction opposite
36+
to that of the incident rays are negative.
37+
4. Distances measured along y-axis above the principal axis are positive and
38+
that measured along y-axis below the principal
39+
axis are negative.
40+
41+
Note: Sign convention can be reversed and will still give the correct results.
42+
43+
Reference for Sign convention:
44+
https://www.toppr.com/ask/content/concept/sign-convention-for-lenses-210246/
45+
46+
Reference for assumptions:
47+
https://testbook.com/physics/derivation-of-lens-maker-formula
48+
"""
49+
50+
51+
def focal_length_of_lens(
52+
object_distance_from_lens: float, image_distance_from_lens: float
53+
) -> float:
54+
"""
55+
Doctests:
56+
>>> from math import isclose
57+
>>> isclose(focal_length_of_lens(10,4), 6.666666666666667)
58+
True
59+
>>> from math import isclose
60+
>>> isclose(focal_length_of_lens(2.7,5.8), -5.0516129032258075)
61+
True
62+
>>> focal_length_of_lens(0, 20) # doctest: +NORMALIZE_WHITESPACE
63+
Traceback (most recent call last):
64+
...
65+
ValueError: Invalid inputs. Enter non zero values with respect
66+
to the sign convention.
67+
"""
68+
69+
if object_distance_from_lens == 0 or image_distance_from_lens == 0:
70+
raise ValueError(
71+
"Invalid inputs. Enter non zero values with respect to the sign convention."
72+
)
73+
focal_length = 1 / (
74+
(1 / image_distance_from_lens) - (1 / object_distance_from_lens)
75+
)
76+
return focal_length
77+
78+
79+
def object_distance(
80+
focal_length_of_lens: float, image_distance_from_lens: float
81+
) -> float:
82+
"""
83+
Doctests:
84+
>>> from math import isclose
85+
>>> isclose(object_distance(10,40), -13.333333333333332)
86+
True
87+
88+
>>> from math import isclose
89+
>>> isclose(object_distance(6.2,1.5), 1.9787234042553192)
90+
True
91+
92+
>>> object_distance(0, 20) # doctest: +NORMALIZE_WHITESPACE
93+
Traceback (most recent call last):
94+
...
95+
ValueError: Invalid inputs. Enter non zero values with respect
96+
to the sign convention.
97+
"""
98+
99+
if image_distance_from_lens == 0 or focal_length_of_lens == 0:
100+
raise ValueError(
101+
"Invalid inputs. Enter non zero values with respect to the sign convention."
102+
)
103+
104+
object_distance = 1 / ((1 / image_distance_from_lens) - (1 / focal_length_of_lens))
105+
return object_distance
106+
107+
108+
def image_distance(
109+
focal_length_of_lens: float, object_distance_from_lens: float
110+
) -> float:
111+
"""
112+
Doctests:
113+
>>> from math import isclose
114+
>>> isclose(image_distance(50,40), 22.22222222222222)
115+
True
116+
>>> from math import isclose
117+
>>> isclose(image_distance(5.3,7.9), 3.1719696969696973)
118+
True
119+
120+
>>> object_distance(0, 20) # doctest: +NORMALIZE_WHITESPACE
121+
Traceback (most recent call last):
122+
...
123+
ValueError: Invalid inputs. Enter non zero values with respect
124+
to the sign convention.
125+
"""
126+
if object_distance_from_lens == 0 or focal_length_of_lens == 0:
127+
raise ValueError(
128+
"Invalid inputs. Enter non zero values with respect to the sign convention."
129+
)
130+
image_distance = 1 / ((1 / object_distance_from_lens) + (1 / focal_length_of_lens))
131+
return image_distance

0 commit comments

Comments
 (0)