Skip to content

Commit 935d1d3

Browse files
vipinkarthicpre-commit-ci[bot]github-actions
authoredOct 5, 2023
Added Mirror Formulae Equation (#9717)
* Python mirror_formulae.py is added to the repository * Changes done after reading readme.md * Changes for running doctest on all platforms * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Change 2 for Doctests * Changes for doctest 2 * updating DIRECTORY.md --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
1 parent 1fda96b commit 935d1d3

File tree

2 files changed

+135
-1
lines changed

2 files changed

+135
-1
lines changed
 

‎DIRECTORY.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@
170170

171171
## Data Structures
172172
* Arrays
173+
* [Median Two Array](data_structures/arrays/median_two_array.py)
173174
* [Permutations](data_structures/arrays/permutations.py)
174175
* [Prefix Sum](data_structures/arrays/prefix_sum.py)
175176
* [Product Sum](data_structures/arrays/product_sum.py)
@@ -185,6 +186,7 @@
185186
* [Diff Views Of Binary Tree](data_structures/binary_tree/diff_views_of_binary_tree.py)
186187
* [Distribute Coins](data_structures/binary_tree/distribute_coins.py)
187188
* [Fenwick Tree](data_structures/binary_tree/fenwick_tree.py)
189+
* [Flatten Binarytree To Linkedlist](data_structures/binary_tree/flatten_binarytree_to_linkedlist.py)
188190
* [Inorder Tree Traversal 2022](data_structures/binary_tree/inorder_tree_traversal_2022.py)
189191
* [Is Bst](data_structures/binary_tree/is_bst.py)
190192
* [Lazy Segment Tree](data_structures/binary_tree/lazy_segment_tree.py)
@@ -324,6 +326,7 @@
324326
* [Longest Common Substring](dynamic_programming/longest_common_substring.py)
325327
* [Longest Increasing Subsequence](dynamic_programming/longest_increasing_subsequence.py)
326328
* [Longest Increasing Subsequence O(Nlogn)](dynamic_programming/longest_increasing_subsequence_o(nlogn).py)
329+
* [Longest Palindromic Subsequence](dynamic_programming/longest_palindromic_subsequence.py)
327330
* [Longest Sub Array](dynamic_programming/longest_sub_array.py)
328331
* [Matrix Chain Order](dynamic_programming/matrix_chain_order.py)
329332
* [Max Non Adjacent Sum](dynamic_programming/max_non_adjacent_sum.py)
@@ -539,6 +542,7 @@
539542
* [Average Mode](maths/average_mode.py)
540543
* [Bailey Borwein Plouffe](maths/bailey_borwein_plouffe.py)
541544
* [Basic Maths](maths/basic_maths.py)
545+
* [Bell Numbers](maths/bell_numbers.py)
542546
* [Binary Exp Mod](maths/binary_exp_mod.py)
543547
* [Binary Exponentiation](maths/binary_exponentiation.py)
544548
* [Binary Exponentiation 3](maths/binary_exponentiation_3.py)
@@ -690,6 +694,7 @@
690694
* [Matrix Class](matrix/matrix_class.py)
691695
* [Matrix Operation](matrix/matrix_operation.py)
692696
* [Max Area Of Island](matrix/max_area_of_island.py)
697+
* [Median Matrix](matrix/median_matrix.py)
693698
* [Nth Fibonacci Using Matrix Exponentiation](matrix/nth_fibonacci_using_matrix_exponentiation.py)
694699
* [Pascal Triangle](matrix/pascal_triangle.py)
695700
* [Rotate Matrix](matrix/rotate_matrix.py)
@@ -708,8 +713,8 @@
708713
* Activation Functions
709714
* [Exponential Linear Unit](neural_network/activation_functions/exponential_linear_unit.py)
710715
* [Leaky Rectified Linear Unit](neural_network/activation_functions/leaky_rectified_linear_unit.py)
711-
* [Scaled Exponential Linear Unit](neural_network/activation_functions/scaled_exponential_linear_unit.py)
712716
* [Rectified Linear Unit](neural_network/activation_functions/rectified_linear_unit.py)
717+
* [Scaled Exponential Linear Unit](neural_network/activation_functions/scaled_exponential_linear_unit.py)
713718
* [Back Propagation Neural Network](neural_network/back_propagation_neural_network.py)
714719
* [Convolution Neural Network](neural_network/convolution_neural_network.py)
715720
* [Perceptron](neural_network/perceptron.py)
@@ -756,9 +761,11 @@
756761
* [Kinetic Energy](physics/kinetic_energy.py)
757762
* [Lorentz Transformation Four Vector](physics/lorentz_transformation_four_vector.py)
758763
* [Malus Law](physics/malus_law.py)
764+
* [Mirror Formulae](physics/mirror_formulae.py)
759765
* [N Body Simulation](physics/n_body_simulation.py)
760766
* [Newtons Law Of Gravitation](physics/newtons_law_of_gravitation.py)
761767
* [Newtons Second Law Of Motion](physics/newtons_second_law_of_motion.py)
768+
* [Photoelectric Effect](physics/photoelectric_effect.py)
762769
* [Potential Energy](physics/potential_energy.py)
763770
* [Rms Speed Of Molecule](physics/rms_speed_of_molecule.py)
764771
* [Shear Stress](physics/shear_stress.py)

‎physics/mirror_formulae.py

+127
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
"""
2+
This module contains the functions to calculate the focal length, object distance
3+
and image distance of a mirror.
4+
5+
The mirror formula is an equation that relates the object distance (u),
6+
image distance (v), and focal length (f) of a spherical mirror.
7+
It is commonly used in optics to determine the position and characteristics
8+
of an image formed by a mirror. It is expressed using the formulae :
9+
10+
-------------------
11+
| 1/f = 1/v + 1/u |
12+
-------------------
13+
14+
Where,
15+
f = Focal length of the spherical mirror (metre)
16+
v = Image distance from the mirror (metre)
17+
u = Object distance from the mirror (metre)
18+
19+
20+
The signs of the distances are taken with respect to the sign convention.
21+
The sign convention is as follows:
22+
1) Object is always placed to the left of mirror
23+
2) Distances measured in the direction of the incident ray are positive
24+
and the distances measured in the direction opposite to that of the incident
25+
rays are negative.
26+
3) All distances are measured from the pole of the mirror.
27+
28+
29+
There are a few assumptions that are made while using the mirror formulae.
30+
They are as follows:
31+
1) Thin Mirror: The mirror is assumed to be thin, meaning its thickness is
32+
negligible compared to its radius of curvature. This assumption allows
33+
us to treat the mirror as a two-dimensional surface.
34+
2) Spherical Mirror: The mirror is assumed to have a spherical shape. While this
35+
assumption may not hold exactly for all mirrors, it is a reasonable approximation
36+
for most practical purposes.
37+
3) Small Angles: The angles involved in the derivation are assumed to be small.
38+
This assumption allows us to use the small-angle approximation, where the tangent
39+
of a small angle is approximately equal to the angle itself. It simplifies the
40+
calculations and makes the derivation more manageable.
41+
4) Paraxial Rays: The mirror formula is derived using paraxial rays, which are
42+
rays that are close to the principal axis and make small angles with it. This
43+
assumption ensures that the rays are close enough to the principal axis, making the
44+
calculations more accurate.
45+
5) Reflection and Refraction Laws: The derivation assumes that the laws of
46+
reflection and refraction hold.
47+
These laws state that the angle of incidence is equal to the angle of reflection
48+
for reflection, and the incident and refracted rays lie in the same plane and
49+
obey Snell's law for refraction.
50+
51+
(Description and Assumptions adapted from
52+
https://www.collegesearch.in/articles/mirror-formula-derivation)
53+
54+
(Sign Convention adapted from
55+
https://www.toppr.com/ask/content/concept/sign-convention-for-mirrors-210189/)
56+
57+
58+
"""
59+
60+
61+
def focal_length(distance_of_object: float, distance_of_image: float) -> float:
62+
"""
63+
>>> from math import isclose
64+
>>> isclose(focal_length(10, 20), 6.66666666666666)
65+
True
66+
>>> from math import isclose
67+
>>> isclose(focal_length(9.5, 6.7), 3.929012346)
68+
True
69+
>>> focal_length(0, 20)
70+
Traceback (most recent call last):
71+
...
72+
ValueError: Invalid inputs. Enter non zero values with respect
73+
to the sign convention.
74+
"""
75+
76+
if distance_of_object == 0 or distance_of_image == 0:
77+
raise ValueError(
78+
"Invalid inputs. Enter non zero values with respect to the sign convention."
79+
)
80+
focal_length = 1 / ((1 / distance_of_object) + (1 / distance_of_image))
81+
return focal_length
82+
83+
84+
def object_distance(focal_length: float, distance_of_image: float) -> float:
85+
"""
86+
>>> from math import isclose
87+
>>> isclose(object_distance(30, 20), -60.0)
88+
True
89+
>>> from math import isclose
90+
>>> isclose(object_distance(10.5, 11.7), 102.375)
91+
True
92+
>>> object_distance(90, 0)
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 distance_of_image == 0 or focal_length == 0:
100+
raise ValueError(
101+
"Invalid inputs. Enter non zero values with respect to the sign convention."
102+
)
103+
object_distance = 1 / ((1 / focal_length) - (1 / distance_of_image))
104+
return object_distance
105+
106+
107+
def image_distance(focal_length: float, distance_of_object: float) -> float:
108+
"""
109+
>>> from math import isclose
110+
>>> isclose(image_distance(10, 40), 13.33333333)
111+
True
112+
>>> from math import isclose
113+
>>> isclose(image_distance(1.5, 6.7), 1.932692308)
114+
True
115+
>>> image_distance(0, 0)
116+
Traceback (most recent call last):
117+
...
118+
ValueError: Invalid inputs. Enter non zero values with respect
119+
to the sign convention.
120+
"""
121+
122+
if distance_of_object == 0 or focal_length == 0:
123+
raise ValueError(
124+
"Invalid inputs. Enter non zero values with respect to the sign convention."
125+
)
126+
image_distance = 1 / ((1 / focal_length) - (1 / distance_of_object))
127+
return image_distance

0 commit comments

Comments
 (0)
Please sign in to comment.