| 
 | 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