9. Ecuaciones de Fresnel

autor:Luis Miguel Sánchez Brea
revisor:José Luis Vilas Prieto

Herramientas utilizadas en este tutorial:

  • scipy: manipulación de arrays de datos
  • matplotlib.pyplot: generación de dibujos similar a Matlab

Archivos necesarios para las ecuaciones de Fresnel:

  • fresnel.py. Archivo con las funciones principales fresnel.py

Contenidos de los archivos:

  • fresnel.py:

    • coeficientesFresnel_dielectricos(). Calcula los coeficientes de Fresnel rs, rp, ts y tp para medios dieléctricos.
    • reflectancia_transmitancia_dielectricos(). Calcula las reflectancias y transmitancias R_perp, R_par, T_perp, T_par para medios dieléctricos
    • coeficientesFresnel_complejo(). Calcula los coeficientes de Fresnel rs, rp, ts y tp para medios absorbentes.
    • reflectancia_transmitancia_complejo(). Calcula las reflectancias y transmitancias R_perp, R_par, T_perp, T_par para medios absorbentes.
    • dibujarCoeficientes(). Dibuja los coeficientes rs, rp, ts y tp.
    • dibujarTransmitancias(). Dibuja los coeficientes R_perp, R_par, T_perp, T_par.

Descarga de archivos:

  • fresnel.py. Archivo con las funciones principales fresnel.py
  • fresnel_aire_vidrio.py. Archivo con el ejemplo del del calculo de la amplitud, fase e intensidad de las componentes paralela y perpendicular en una intercara aire-vidrio fresnel_aire_vidrio.py
  • fresnel_vidrio_aire.py. Archivo con el ejemplo del del calculo de la amplitud, fase e intensidad de las componentes paralela y perpendicular en una intercara aire-vidrio fresnel_vidrio_aire.py
  • fresnel_aire_metal.py. Archivo con el ejemplo del del calculo de la amplitud, fase e intensidad de las componentes paralela y perpendicular en una intercara aire-vidrio fresnel_aire_metal.py

9.1. Introducción

Las ecuaciones de Fresnel permiten calcular los campos transmitido y reflejado cuando una onda armónica plana incide sobre una interfaz entre dos medios con índice de refracción distinto. Tienen una dependencia del estado de polarización del haz incidente (paralelo al plano de incidencia, perpendicular al plano de incidencia o una combinación), de los índices de refracción del medio de entrada y de salida (n_1, n_2) y del ángulo de incidencia \theta_i. El ángulo del haz transmitido \theta_t se obtiene a través de la ley de Snell: n_1\,sin(\theta_i)=n_2\,sin(\theta_t).

Dichos campos reflejados y transmitido son lineales con el campo incidente y los coeficientes de proporcionalidad son los coeficientes de fresnel. Para el caso de los campos reflejados

E_{r}^{\parallel}=r_{\parallel}*E_i,

E_{r}^{\perp}=r_{\perp}*E_i,

y para los campos transmitidos

E_{t}^{\parallel}=t_{\parallel}*E_i,

E_{t}^{\perp}=t_{\perp}*E_i.

Un análisis riguroso de cómo calcular dichos coeficientes de Fresnel a partir de las ecuaciones de Maxwell se pueden encontrar en el libro de Cabrera [1] (capítulos 9 y 10). Para el caso de que los dos medios sean dieléctricos estas ecuaciones resultan ser

r_{\parallel}=\frac{n_2\,cos(\theta_i)-n_1\,cos(\theta_t)}{n_2\,cos(\theta_i)+n_1\,cos(\theta_t)},

r_{\perp}=\frac{n_1\,cos(\theta_i)-n_2\,cos(\theta_t)}{n_1\,cos(\theta_i)+n_2\,cos(\theta_t)},

y para los campos transmitidos

t_{\parallel}=\frac{2\,n_1\,cos(\theta_i)}{n_2\,cos(\theta_i)+n_1\,cos(\theta_t)},

t_{\perp}=\frac{2\,n_1\,cos(\theta_i)}{n_1\,cos(\theta_i)+n_2\,cos(\theta_t)}.

Para el caso de que uno de los medios tenga índice de refracción comlejo, es decir sea un medio absorbente, entonces las ecuaciones son algo más complicadas. Se pueden encontrar en el libro de Cabrera [1], capítulo 9.

9.2. Funciones para calcular las ecuaciones de Fresnel

En el archivo fresnel.py se han implementado las funciones que permiten el cálculo de los coeficientes y las reflectancias. Dichas funciones tienen la entrada de los índices de refracción n1, n2 y de un array de números que representan el ángulo de incidencia. La salida de estas funciones son: r_perp, r_par, t_perp, t_par cuando se calculan coeficientes y R_perp, R_par, T_perp, T_par cuando se calculan reflectancias o transmitancias. Estos parámetros los aceptan las funciones para dibujar.

La variable theta_i puede ser un número o un array generado con numpy. De esta forma se simplifican las representaciones y se acelera enormemente el tiempo de cálculo. Por consiguiente, las funciones de cálculo devuelven un array para los coeficientes r_{\parallel}, r_{\perp}, t_{\parallel} y t_{\perp} cuyo tamaño es igual al \theta_i.

9.2.1. Cálculo de los coeficientes de Fresnel: medios dieléctricos

El cálculo de los coefientes de Fresnel en medios dieléctricos se ha implementado, y es mostrado en el siguiente extracto de código. Para ello se ha creado la función coeficientesFresnel_dielectricos e introducido las ecuaciones de Fresnel de los coeficientes de reflexión y transmisión para ls variables de entrada del ángulo de incidencia y los índices de refracción del medio y del material dieléctrico.

def coeficientesFresnel_dielectricos(n1, theta_i, n2):
#	
#	Calcula las componentes rs, rp, ts y tp mediante las eq. de Fresnel
#	solamente se pueden admitir medios dielectricos, es decir indices de refraccion reales.
#	Las ecuaciones programadas estan en Cabrera pagina 262

    #ley de sell para conseguir theta_t
    theta_t=sp.arcsin(n1*sin(theta_i)/n2)
    
    #Precalculo para acelerar los calculos
    cos_i=cos(theta_i)
    cos_t=cos(theta_t)

    #Coeficientes de Fresnell
    r_par=(n2*cos_i-n1*cos_t)/(n2*cos_i+n1*cos_t)
    r_perp=(n1*cos_i-n2*cos_t)/(n1*cos_i+n2*cos_t)
    t_par=(2*n1*cos_i)/(n2*cos_i+n1*cos_t)
    t_perp=(2*n1*cos_i)/(n1*cos_i+n2*cos_t)

    return r_perp, r_par, t_perp, t_par

9.2.2. Cálculo de la transmitancia y reflectancia: medios dieléctricos

Definidos los coeficientes de Fresnel se puede calcular la transmitancia y la reflectancia entendiendo estas magnitudes como la relación entre la intensidad reflejada o transmitida y la intensidad del haz incidente(más detalles en [1]). Así estos parámetros pueden ser derivados de los coeficientes de Fresnell como se muestra en el código a partir de la función reflectancia_transmitancia_dielectricos.

def reflectancia_transmitancia_dielectricos(n1, theta_i, n2):
    """"Cabrera. pag 266"""
    #Se calculan lo coeficientes de Fresnel
    r_perp, r_par, t_perp, t_par= coeficientesFresnel_dielectricos(n1, theta_i, n2)

    #Ley de sell para conseguir theta_t
    theta_t=sp.arcsin(n1*sin(theta_i)/n2)

    #acelera los calculos
    cos_i=cos(theta_i)
    cos_t=cos(theta_t)

    #calculo de transmitancia y reflectancia
    R_perp=abs(r_perp)**2
    R_par=abs(r_par)**2
    T_perp=abs(t_perp)**2*(n2*cos_t)/(n1*cos_i)
    T_par=abs(t_par)**2*(n2*cos_t)/(n1*cos_i)

    return R_perp, R_par, T_perp, T_par

9.2.3. Cálculo de los coeficientes de Fresnel: medios absorbentes

Los medios absorbentes se caracterizan por tener un índice de refracción complejo. Nuevamente las relaciones de Fresnel permiten determinar los coeficientes de transmisión y reflexión.

def coeficientesFresnel_complejo(n1, theta_i, n2c):
    """
    Calcula las componentes rs y rp mediante las eq. de Fresnel
    n^=n-ik
    ejemplo:
        theta_i=sp.linspace(0*grados,90*grados,10), 

    Los parametros de entrada pueden ser arrays de numeros. 
    Para dibujarlos el array debe ser theta_i 
    n2c puede ser complejo
    """
    #Precalculos
    kiz=cos(theta_i)
    ktcz=sp.sqrt(n2c**2-n1**2*sin(theta_i)**2)
    ktc2= n2c**2
    ki2 = n1**2

    #Calculo de los coeficientes de Fresnel
    r_perp= (kiz-ktcz)/(kiz+ktcz)
    t_perp= 2*kiz/(kiz+ktcz)
    r_par= (kiz*ktc2-ktcz*ki2)/(kiz*ktc2+ktcz*ki2)
    t_par= 2*kiz*ktc2/(kiz*ktc2+ktcz*ki2)

    theta_i = theta_i/ grados

    return r_perp, r_par, t_perp, t_par

9.2.4. Cálculo de la transmitancia y reflectancia: medios absorbentes

En general la intensidad de la onda incidente no es la superposición de la transmitida y la reflejada, sino que el material posee una cierta capacidad de absorción de la radiación. Así, la suma de la absorbancia, la reflectancia y la transmitancia es la unidad conservándose la energía. La función reflectancia_transmitancia_complejo permite calcular la transmitancia y reflectancia.

def reflectancia_transmitancia_complejo(n1, theta_i, n2c):
    """
    Calcula las componentes rs y rp mediante las eq. de Fresnel
    n^=n-ik
    ejemplo:
        theta_i=sp.linspace(0*grados,90*grados,10), 

    Los parametros de entrada pueden ser arrays de numeros. 
    Para dibujarlos el array debe ser theta_i 
    n2c puede ser complejo
    """
    #Coeficientes de Fresnel
    r_perp, r_par, t_perp, t_par = coeficientesFresnel_complejo(n1, theta_i, n2c)
    #Reflectancia
    R_perp=abs(r_perp)**2
    R_par=abs(r_par)**2
    #Precalculo
    kiz=cos(theta_i)
    ki2 = n1**2
    ktcz=sp.sqrt(n2c**2-n1**2*sin(theta_i)**2)
    ktc2=n2c**2
    n2R=sp.real(n2c)
    kappa2=sp.imag(n2c)
    B=n2R**2-kappa2**2-n1**2*sin(theta_i)**2
    ktz=sp.sqrt(0.5*(B+sp.sqrt(B**2+4*n2R**2*kappa2**2)))
    #Transmitancias
    T_perp=ktz*abs(t_perp)**2/kiz
    T_par=ki2*sp.real(ktcz/ktc2)*abs(t_par)**2/kiz

    return R_perp, R_par, T_perp, T_par

9.2.5. Funciones de dibujo

Hasta el moemnto se han implementado fisntintas funciones que permiten determinar los coeficientes de Fresnel en función del ángulo del haz incidente y de los índices de refracción del medio y del material. En este epígrafe, se pretende definir una función de debujo capaz de dibujar los coeficientes de Fresnel en función de \theta_i. Los datos que dibuja son los resultantes de coeficientesFresnel_dielectricos() o de coeficientesFresnel_complejo().

def dibujarCoeficientes(n1, theta_i, n2, r_perp, r_par, t_perp, t_par, nombreArchivo = ''):
    """
    Dibuja las ecuaciones de fresnel en funcion del angulo de entrada
    """
    #Generacion della figura
    plt.figure(figsize=(12,6))

    #Amplitud		
    plt.subplot(1,2, 1)
    plt.plot(theta_i / grados, abs(r_perp)*sp.sign(r_perp) , 'k--', lw = 2,\
             label = u"$r_{\perp}$")
    plt.plot(theta_i / grados, abs(r_par)*sp.sign(r_par) , 'k', lw = 2,\
             label = u"$r_{\parallel}$")
    plt.plot(theta_i / grados, abs(t_perp)*sp.sign(t_perp) , 'r--', lw = 2,\
             label = r"$t_{\perp}$")
    plt.plot(theta_i / grados, abs(t_par)*sp.sign(t_par) , 'r', lw = 2,\
             label = r"$t_{\parallel}$")
    #Leyenda de los ejes
    plt.xlabel(r"$\phi (grados)$", fontsize = 22)
    plt.ylabel(r"$Amplitud$", fontsize = 22)
    plt.ylim(-1., 2.01)
    plt.legend(loc=2,prop={'size':18})

    #Fase		
    plt.subplot(1,2, 2)
    plt.plot(theta_i / grados, sp.unwrap(sp.angle(r_perp),2*sp.pi), 'k--', lw = 2,\
             label = r"$r_{\perp}$")
    plt.plot(theta_i / grados, sp.unwrap(sp.angle(r_par),2*sp.pi), 'k', lw = 2,\
             label =  r"$r_{\parallel}$")
    plt.plot(theta_i / grados, sp.unwrap(sp.angle(t_perp),2*sp.pi), 'r--', lw = 2,\
             label = r"$t_{\perp}$")
    plt.plot(theta_i / grados, sp.unwrap(sp.angle(t_par),2*sp.pi), 'r', lw = 2,\
             label = r"$t_{\parallel}$")
    #Leyenda de los ejes
    plt.xlabel(r"$\phi (grados)$", fontsize = 22)
    plt.ylabel(r"$fase$", fontsize = 22)
    #plt.ylim(-sp.pi - 0.01, sp.pi + 0.01)
    plt.legend(loc=2,prop={'size':18})

    if not nombreArchivo == '':
        plt.savefig(nombreArchivo, dpi = 100, bbox_inches = 'tight', pad_inches = 0.1)

La función que dibuja la reflectancia y transmitancia es

def dibujarTransmitancias(n1, theta_i, n2, R_perp, R_par, T_perp, T_par, nombreArchivo = ''):
    """
    Dibuja las ecuaciones de fresnel en funcion del angulo de entrada
    """
    #Generacion de la figura
    plt.figure()
    #dibujo
    plt.subplot(1, 1, 1)
    plt.plot(theta_i / grados, abs(R_perp) , 'k--', lw = 2, label = u"$R_{\perp}$")
    plt.plot(theta_i / grados, abs(R_par) , 'k', lw = 2, label = u"$R_{\parallel}$")
    plt.xlabel(r"$\phi (grados)$", fontsize = 22)
    plt.ylabel(r"$Amplitud$", fontsize = 22)
    plt.ylim(-0.01, 1.01)
    plt.plot(theta_i / grados, abs(T_perp) , 'r--', lw = 2, label = r"$T_{\perp}$")
    plt.plot(theta_i / grados, abs(T_par) , 'r', lw = 2, label = r"$T_{\parallel}$")
    plt.xlabel(r"$\phi (grados)$", fontsize = 22)
    plt.ylabel(r"$I$", fontsize = 22)
    plt.ylim(-0.01, 1.01)
    plt.legend(loc=3,prop={'size':18})

    if not nombreArchivo == '':
        plt.savefig(nombreArchivo, dpi = 100, bbox_inches = 'tight', pad_inches = 0.1)

9.3. Ejemplos

Los ejemplos de utilización del archivo fresnel.py se presentan en el archivo fresnel_ejemplos.py. Como se puede observar en el código siguiente, con muy poco código se obtienen los ejemplos, pues simplemente es necesario declarar los parámetros, calcular los coeficientes y dibujar. Todas estas funciones ya han sido desarrolladas previamente.

9.3.1. Calculo de los coeficientes de fresnel

El el siguiente ejemplo se muestra cómo llamar a la función coeficientesFresnel_dielectricos para un único valor de los parámetros

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#----------------------------------------------------------------------
# Autor:	Luis Miguel Sanchez Brea
# Fecha		2013/10/24 (version 1.0)
# Licencia:	GPL
#----------------------------------------------------------------------
"""
ejemplos para las ecuaciones de Fresnel
"""
#Paquetes
import sys
sys.path.append('../')
from fresnel import *  #@UnusedWildImport

def coeficientes():
	"interfaz aire-vidrio"
	#Coeficientes de Fresnel para un caso particular
	r_perp, r_par, t_perp, t_par = coeficientesFresnel_dielectricos(n1 = 1.5,\
 theta_i = 45 * grados, n2 = 1.0)
        #Muestra de resultados
	print "coeficientes de reflexion paralelo: r_par= (%2.4f,%2.4f)" % (r_par.real,\
 r_par.imag)
	print "coeficientes de reflexion perpendicular: r_perp= (%2.4f,%2.4f)" % (r_perp.real,\
 r_perp.imag)
	print "coeficientes de transmision paralelo: t_par= (%2.4f,%2.4f)" % (t_par.real,\
 t_par.imag)
	print "coeficientes de transmision perpendicular: t_perp= (%2.4f,%2.4f)" % (t_perp.real,\
 t_perp.imag)

if __name__ == '__main__':
	coeficientes()

Se supone la propagación de un haz en aire, que incide a 45 grados sobre un vidrio dieléctrico con índice 1.5. Así, el resultado es:

>> coeficientes de reflexion paralelo: r_par= (0.2800,-0.9600)
>> coeficientes de reflexion perpendicular: r_perp= (0.8000,-0.6000)
>> coeficientes de transmision paralelo: t_par= (1.9200,-1.4400)
>> coeficientes de transmision perpendicular: t_perp= (1.8000,-0.6000)

9.3.2. Interfaz aire-vidrio

En este ejemplo se considera la incidencia de un haz de luz en el aire sobre una superficie de vidrio con índice 1.5. Se representan la amplitud transmitida y reflejada, así como la fase reflejada en función del ángulo de incidencia. Como se puede ver en las curvas de amplitud, la transmitancia paralela y perpendicular son relativamente similares. Si se representan las transmitancias y reflectancias, se observa que cuando la reflectancia es mínima la transmitancia es máxima. Relación lógica puesto que R+T=1. No obstante es de especial interés este extremal, llamandose ángulo de Brewster a aquel para el que la reflectancia es mínima. Así se observa que la fase cambia radicalmente en dicho punto, y la luz reflejada resulta perfectamente polarizada.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#----------------------------------------------------------------------
# Autor:	Luis Miguel Sanchez Brea
# Fecha		2013/10/24 (version 1.0)
# Licencia:	GPL
#----------------------------------------------------------------------
"""
ejemplos para las ecuaciones de Fresnel
"""
#Carga de paquetes
import sys
sys.path.append('../')
from fresnel import *  #@UnusedWildImport

def fresnel_aire_vidrio():
	"interfaz aire-vidrio"
	n1 = 1.
	n2 = 1.5
	theta_i = sp.linspace(0 * grados, 90 * grados, 500)

	#se calculan los coeficientes de Fresnel para un array
	r_perp, r_par, t_perp, t_par = coeficientesFresnel_dielectricos(n1 = n1,\
 theta_i = theta_i, n2 = n2)
	dibujarCoeficientes(n1, theta_i, n2, r_perp, r_par, t_perp, t_par)
        #Transmitancia y reflectancia
	R_perp, R_par, T_perp, T_par= reflectancia_transmitancia_dielectricos(n1, theta_i, n2)
	dibujarTransmitancias(n1, theta_i, n2, R_perp, R_par, T_perp, T_par)

if __name__ == '__main__':
	fresnel_aire_vidrio()
	plt.show()

(Source code)

9.3.3. Interfaz vidrio-aire

Este ejemplo es el contrario al anterior, se supone un haz de luz propagandose en vidrio, y se analiza el comportamiento del haz a la salida del material. Nuevamente se observa la reflexión de Brewster en un ángulo cercano a los 40 grados, y como cerca de este la transmitancia cambia abruptamente hasta el punto que únicamente se produce reflexión del haz.

def fresnel_vidrio_aire():
	"interfaz vidrio-aire"
	n1 = 1.5
	n2 = 1.
	theta_i = sp.linspace(0 * grados, 90 * grados, 500)

	#Se calculan los coeficientes de Fresnel para un array
	r_perp, r_par, t_perp, t_par = coeficientesFresnel_complejo(n1 = n1,\
 theta_i = theta_i, n2c = n2)
	dibujarCoeficientes(n1, theta_i, n2, r_perp, r_par, t_perp, t_par)
        #Reflectancia y transmitancia
	R_perp, R_par, T_perp, T_par= reflectancia_transmitancia_complejo(n1, theta_i, n2)
	dibujarTransmitancias(n1, theta_i, n2, R_perp, R_par, T_perp, T_par)

(Source code)

9.3.4. Interfaz aire-metal

Los metales se caracterizan por tener un índice de refracción complejo siendo negativa la parte imaginaria del mismo. Así se supone la incidence de un haz sobre una intercara aire-metal, con índice de refracción n=0.769-i6.08. Es destacable como la variación en la fase de la componente paralela, es prácticamente invariante bajo cambios en el ángulo de incidencia.

def fresnel_aire_metal():
	"interfaz aire-metal"
	n1 = 1.
	#el metal se introduce con numero complejo cuya parte imaginaria es negativa
	n2c = 0.769 - 6.08j
	theta_i = sp.linspace(0 * grados, 90 * grados, 500)

	#se calculan los coeficientes de Fresnel para un array	
	r_perp, r_par, t_perp, t_par = coeficientesFresnel_complejo(n1, theta_i, n2c)
	dibujarCoeficientes(n1, theta_i, n2c, r_perp, r_par, t_perp, t_par)
        #Reflectancia y transmitancia
	R_perp, R_par, T_perp, T_par= reflectancia_transmitancia_complejo(n1, theta_i, n2c)
	dibujarTransmitancias(n1, theta_i, n2c, R_perp, R_par, T_perp, T_par)

(Source code)

9.4. Ejercicios

  • Determinar el valor de la reflectancia y transmitancia en incidencia normal cuando el medio incidente es el vacío (n=1) y el segundo medio es aluminio.
  • Hacer una función para dibujar los coeficientes de reflexión y transmisión cuando un haz incide de forma normal desde el vacío sobre un medio dieléctrico cuyo índice de refracción varía entre 1 y 2.
  • Calcular mediante una gráfica para qué ángulo hay un mínimo de Reflectancia en la componente paralela en el oro (se puede mirar su índice de refracción en la wikipedia).
  • Sea un haz policromático entre 400 nm y 600 nm que incide sobre un medio dispersivo en el vacio. El índice de refración es n(lambda)=1.5-0.1/lambda. Representar las transmitancias para 400,450,500,550 y 600 nm en una misma gráfica.

9.5. Referencias

[1](1, 2, 3) J.M. Cabrera, F.J. López, F. Agulló López ; Óptica Electromagnética: Fundamentos; Addison-Wesley (2001) ISBN 9788478290215