Skip to content

Commit e906a51

Browse files
SparshRastogipre-commit-ci[bot]CaedenPH
authored
Create malus_law.py (#7710)
* Create malus_law.py Finding the intensity of light transmitted through a polariser using Malus Law and by taking initial intensity and angle between polariser and axis as input * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update physics/malus_law.py Co-authored-by: Caeden Perelli-Harris <[email protected]> * Update physics/malus_law.py Co-authored-by: Caeden Perelli-Harris <[email protected]> * Update physics/malus_law.py Co-authored-by: Caeden Perelli-Harris <[email protected]> * Update physics/malus_law.py Co-authored-by: Caeden Perelli-Harris <[email protected]> * Update malus_law.py Made some changes in the error messages and the docstring testcases * Update malus_law.py Made changes for the passing the precommit * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Caeden Perelli-Harris <[email protected]>
1 parent d33f9b3 commit e906a51

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

physics/malus_law.py

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import math
2+
3+
"""
4+
Finding the intensity of light transmitted through a polariser using Malus Law
5+
and by taking initial intensity and angle between polariser and axis as input
6+
7+
Description : Malus's law, which is named after Étienne-Louis Malus,
8+
says that when a perfect polarizer is placed in a polarized
9+
beam of light, the irradiance, I, of the light that passes
10+
through is given by
11+
I=I'cos²θ
12+
where I' is the initial intensity and θ is the angle between the light's
13+
initial polarization direction and the axis of the polarizer.
14+
A beam of unpolarized light can be thought of as containing a
15+
uniform mixture of linear polarizations at all possible angles.
16+
Since the average value of cos²θ is 1/2, the transmission coefficient becomes
17+
I/I' = 1/2
18+
In practice, some light is lost in the polarizer and the actual transmission
19+
will be somewhat lower than this, around 38% for Polaroid-type polarizers but
20+
considerably higher (>49.9%) for some birefringent prism types.
21+
If two polarizers are placed one after another (the second polarizer is
22+
generally called an analyzer), the mutual angle between their polarizing axes
23+
gives the value of θ in Malus's law. If the two axes are orthogonal, the
24+
polarizers are crossed and in theory no light is transmitted, though again
25+
practically speaking no polarizer is perfect and the transmission is not exactly
26+
zero (for example, crossed Polaroid sheets appear slightly blue in colour because
27+
their extinction ratio is better in the red). If a transparent object is placed
28+
between the crossed polarizers, any polarization effects present in the sample
29+
(such as birefringence) will be shown as an increase in transmission.
30+
This effect is used in polarimetry to measure the optical activity of a sample.
31+
Real polarizers are also not perfect blockers of the polarization orthogonal to
32+
their polarization axis; the ratio of the transmission of the unwanted component
33+
to the wanted component is called the extinction ratio, and varies from around
34+
1:500 for Polaroid to about 1:106 for Glan–Taylor prism polarizers.
35+
36+
Reference : "https://en.wikipedia.org/wiki/Polarizer#Malus's_law_and_other_properties"
37+
"""
38+
39+
40+
def malus_law(initial_intensity: float, angle: float) -> float:
41+
"""
42+
>>> round(malus_law(10,45),2)
43+
5.0
44+
>>> round(malus_law(100,60),2)
45+
25.0
46+
>>> round(malus_law(50,150),2)
47+
37.5
48+
>>> round(malus_law(75,270),2)
49+
0.0
50+
>>> round(malus_law(10,-900),2)
51+
Traceback (most recent call last):
52+
...
53+
ValueError: In Malus Law, the angle is in the range 0-360 degrees
54+
>>> round(malus_law(10,900),2)
55+
Traceback (most recent call last):
56+
...
57+
ValueError: In Malus Law, the angle is in the range 0-360 degrees
58+
>>> round(malus_law(-100,900),2)
59+
Traceback (most recent call last):
60+
...
61+
ValueError: The value of intensity cannot be negative
62+
>>> round(malus_law(100,180),2)
63+
100.0
64+
>>> round(malus_law(100,360),2)
65+
100.0
66+
"""
67+
68+
if initial_intensity < 0:
69+
raise ValueError("The value of intensity cannot be negative")
70+
# handling of negative values of initial intensity
71+
if angle < 0 or angle > 360:
72+
raise ValueError("In Malus Law, the angle is in the range 0-360 degrees")
73+
# handling of values out of allowed range
74+
return initial_intensity * (math.cos(math.radians(angle)) ** 2)
75+
76+
77+
if __name__ == "__main__":
78+
import doctest
79+
80+
doctest.testmod(name="malus_law")

0 commit comments

Comments
 (0)