8. Índice de refracción: modelo microscópico

Autor:Luis Miguel Sánchez Brea

Herramientas utilizadas en este tutorial:

  • numpy: manipulación de datos
  • scipy: Herramientas matemáticas

Descarga de archivos:

8.1. Introducción

Los ejemplos que aquí se desarrollan son autocontenidos, es decir, no necesitan de librerías especificas excepto las estándar. El objetivo de este tema es, por una parte, conocer la relación entre el modelo microscópico clásico de interacción radiación-materia con el índice de refracción. Asimismo, se pretende analizar diversas expresiones analíticas para el índice de refracción, conociendo las propiedades del índice de refracción tales como la absorción y la dispersión.

Se compara las definiciones macroscópica y microscópica de la polarización. La primera se calcula a través las ecuaciones macroscópicas de Maxwell.

\mathbf{P}=\varepsilon_{0}\chi_{e}\mathbf{E}_{mac},

La segunda se calcula a partir de las trayectorias de los átomos analizadas en el átomo de Lorentz. Mediante esta comparación se obtiene una ecuación para la constante dieléctrica en función de los parámetros microscópicos:

\mathbf{P}=\alpha\frac{N}{\Delta V}\underbrace{\frac{1}{N}\sum_{j=1}^{N}\mathbf{E}_{mic,j}}.

De esta forma se calcula la constante dieléctrica

\varepsilon=\varepsilon_{0}\left(1+N_{V}\frac{q^{2}}{m\epsilon_{0}}\sum_{j}\frac{f_{j}}{\omega_{0^{2}}-\omega^{2}-i\gamma_{j}\omega}\right),

Como también es conocido, se puede obtener el índice de refracción a partir de la constante dieléctrica

n_{c}=\sqrt{\frac{\varepsilon_{gen}}{\varepsilon_{0}}}.

8.2. Índice de refracción para cargas ligadas

En el caso de que no haya cargas libres, es decir, que el medio sea dieléctrico, el índice de refracción se puede simplificar a

\varepsilon=\varepsilon_{0}\left(1+N_{V}\frac{q^{2}}{m\epsilon_{0}}\sum_{j}\frac{f_{j}}{\omega_{0}^{2}-\omega^{2}-i\gamma_{j}\omega}\right),

donde la sumatoria representa los distintos tipos de resonancias que existen en el material.

Sacando las partes real e imaginaria se puede obtener el índice de refracción y de absorción.

n&=1+N_{V}\frac{q^{2}}{2m\epsilon_{0}}\sum_{j}\frac{(\omega_{0,j}^{2}-\omega^{2})f_{j}}{(\omega_{0j}^{2}-\omega^{2})^{2}+\gamma_{j}^{2}\omega},

\kappa&=N_{V}\frac{q^{2}}{2m\epsilon_{0}}\sum_{j}\frac{\omega\gamma_{j}f_{j}}{(\omega_{0j}^{2}-\omega^{2})^{2}+\gamma_{j}^{2}\omega^{2}}.

En el siguiente ejemplo se muestra el índice de refracción para dos ejemplos. En el primero se muestra el índice de refracción debido solamente a una resonancia.

En el segundo ejemplo se muestra el índice de refracción cuando el medio tiene 3 resonancias. Se observa un carácter acumulativo. Para bajas frecuencias, el índice de refracción no es la unidad, sino mayor, mientras que para altas frecuencias, por encima de la resonancia, la luz no observa la materia y el índice de refracción es la unidad.

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
#------------------------------------
# Autor:	Luis Miguel Sanchez Brea
# Fecha		2013/10/24 (version 1.0)
# Licencia:	GPL
# Objetivo:	Ejemplos de difraccion en campo lejano
#-------------------------------------

import scipy as sp
import matplotlib.pyplot as plt

m = 1; kg = 1; sg = 1;  V = 1; C = 1;
Hz = 1 / sg; nm = 1e-9 * m

q=1.6021765e-19*C
m=9.109382911e-31*kg
epsilon0=8.8541878176e-12

def indice_refraccion(Nv=1e15, f=(0.5,), w0 = (1e15 * Hz,), gamma = (1e8 * Hz,)):

	#frecuencia de la luz. Array con diversas frecuencias en torno a la resonancia
	n_puntos = 1000
	anchura = 20
	w = sp.linspace(min(w0) - anchura * max(gamma), max(w0) + anchura * max(gamma), n_puntos)

	#distancia electron-nucleo
	n2=1

	for fj, w0j, gammaj in zip(f,w0,gamma):
		n2=n2+Nv*q**2/(m*epsilon0)*fj/(w0j**2-w**2-1j*w*gammaj)

	nc=sp.sqrt(n2)
	n=sp.real(nc)
	kappa=sp.imag(nc)

	plt.figure()
	#parte real
	plt.subplot(211)
	plt.plot(w, n, 'k', linewidth = 2)
	plt.xlabel('$\omega \; (Hz)$', fontsize = 18)
	plt.xlim(max(0,w[0]),w[-1])
	plt.ylabel('$n$', fontsize = 18)
	plt.grid(True)

	#parte imaginaria
	plt.subplot(212)
	plt.plot(w, kappa, 'k', linewidth = 2)
	plt.xlabel('$\omega \; (Hz)$', fontsize = 18)
	plt.xlim(max(0,w[0]),w[-1])
	plt.ylabel('$\kappa$', fontsize = 18)
	plt.grid(True)
	plt.tight_layout()


#ejemplo de 1 resonancia
indice_refraccion(Nv=1e18, f=(1,), w0 = (1e13 * Hz,), gamma = (1e8 * Hz,))

#ejemplo con 2 resonancias
indice_refraccion(Nv=3e24, f=(0.33,0.33), w0 = (2e14 * Hz,4e14*Hz), gamma = (1e12 * Hz,1e12 * Hz))

#muchas resonancias
f=(0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1)
w0= sp.array([1.0,1.2,1.4,1.6,1.8,2.0,2.2,2.4,2.6,2.8])*4e14*Hz
gamma= sp.array([1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0])*1e14*Hz
indice_refraccion(Nv=1e26, f=f, w0 = w0, gamma = gamma)

plt.show()

(Source code)

8.3. Aproximación de Sellmeier

La ecuación anteriormente descrita es interesante, pero a la hora de trabajar con ella es mejor realizar algún tipo de aproximación. En primer lugar porque en Óptica se suele trabajar con longitudes de onda y no con frecuencias. La segunda es para hacer casar las ecuaciones de la dispersión de materiales, conocidas previamente y utilizadas en la óptica geométrica.

Una de ellas es la ec. de Sellmeier.

n^{2}(\lambda)-1=a+\frac{b\lambda^{2}}{\lambda^{2}-\lambda_{1}^{2}}+\frac{c\lambda^{2}}{\lambda^{2}-\lambda_{2}^{2}}+...

Se pueden encontrar los parámetros en muchas páginas web. Por ejemplo, hemos utilizado los siguientes materiales bastante comunes

Fused_Silica_B=(6.96166300E-01, 4.07942600E-01, 8.97479400E-01)
Fused_Silica_C=(4.67914826E-03, 1.35120631E-02, 9.79340025E01)

BK7_B=(1.03961212E00, 2.31792344E-01, 1.01046945E00)
BK7_C=(6.00069867E-03, 2.00179144E-02, 1.03560653E02)

MgF_B=(4.13440230E-01, 5.04974990E-01, 2.49048620E00)
MgF_C=(1.35737865E-03, 8.23767167E-03, 5.65107755E02)

Zafiro_B=(1.50397590E00, 5.50691410E-01, 6.59273790E00)
Zafiro_C=(5.48041129E-03, 1.47994281E-02, 4.02895140E02)

Veamos algunas de las gráficas y el código para programarlos. Este parámetro se denomina dispersión cromática.

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
#------------------------------------
# Autor:	Luis Miguel Sanchez Brea
# Fecha		2013/10/24 (version 1.0)
# Licencia:	GPL
# Objetivo:	Ejemplos de difraccion en campo lejano
#-------------------------------------

import scipy as sp
import matplotlib.pyplot as plt

wavelength=sp.linspace(0.4, 1 ,1000)

MgF_B=(4.13440230E-01, 5.04974990E-01, 2.49048620E00)
MgF_C=(1.35737865E-03, 8.23767167E-03, 5.65107755E02)



Zafiro_B=(1.50397590E00, 5.50691410E-01, 6.59273790E00)
Zafiro_C=(5.48041129E-03, 1.47994281E-02, 4.02895140E02)

Fused_Silica_B=(6.96166300E-01, 4.07942600E-01, 8.97479400E-01)
Fused_Silica_C=(4.67914826E-03, 1.35120631E-02, 9.79340025E01)


BK7_B=(1.03961212E00, 2.31792344E-01, 1.01046945E00)
BK7_C=(6.00069867E-03, 2.00179144E-02, 1.03560653E02)
print sp.sqrt(Zafiro_C)

#la longitud de onda debe ser en micras

#no es la definicion de clase sino wikipedia - que esta en otros

def indice_refraccion(wavelength, B,C):

	i=2
	n2=sp.zeros_like(wavelength)+1
	for bi,ci in zip(B,C):
		n2=n2+bi*wavelength**2/(wavelength**2-ci)

	n=sp.sqrt(n2)
	return n


def dibujar_n(wavelength,n, titulo=''):
	#diversos dibujos
	plt.figure()
	plt.plot(wavelength, n, 'k', linewidth = 2)
	plt.xlabel('$\lambda (\mu m)$', fontsize = 18)
	plt.xlim(wavelength[0],wavelength[-1])
	plt.ylabel('$n$', fontsize = 18)
	plt.title(titulo, fontsize=20)
	plt.grid(True)


n=indice_refraccion(wavelength, BK7_B,BK7_C)
dibujar_n(wavelength,n,'Sellmeier: BK7')

n=indice_refraccion(wavelength, Fused_Silica_B,Fused_Silica_C)
dibujar_n(wavelength,n,'Sellmeier: Fused_Silica')

n=indice_refraccion(wavelength, Zafiro_B,Zafiro_C)
dibujar_n(wavelength,n,'Sellmeier: Zafiro')

"""
#tambien se puede obtener el valor para 1 dato solo, sin dibujar
wavelength=0.5
n05=indice_refraccion(wavelength, BK7_B,BK7_C)
print "el indice de refraccion BK7 para  %4.4f um es %4.6f" %(wavelength,n05)
"""

plt.show()

(Source code)

A partir de esta ecuación se puede calcular el número de Abbe, que es un parámetro para calcular la dispersión del material.

8.4. Aproximación de Cauchy

Otra de las expresiones típicas para ajustar el indice de refracción con la longitud de onda es la ecuación de Cauchy,

n(\lambda)=A+\frac{B}{\lambda^{2}}+\frac{C}{\lambda^{4}}+..

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
#------------------------------------
# Autor:	Luis Miguel Sanchez Brea
# Fecha		2013/10/24 (version 1.0)
# Licencia:	GPL
# Objetivo:	Ejemplos de difraccion en campo lejano
#-------------------------------------

import scipy as sp
import matplotlib.pyplot as plt

m = 1; kg = 1; sg = 1;  V = 1; C = 1;
Hz = 1 / sg; nm = 1e-9 * m; um=1e-6

q=1.6021765e-19*C
m=9.109382911e-31*kg
epsilon0=8.8541878176e-12

wavelength=sp.linspace(400*nm, 1000*nm,1000)

Fused_silica=(1.4580,0.00354*um**2)
Borosilicate_BK7=(1.5046,0.00420*um**2)
Hard_crown_K5=(1.5220,0.00459*um**2)
Barium_crown_BaK4 =(1.5690,0.00531*um**2)
Barium_BaF10=(1.6700,0.00743*um**2)
Dense_flint_SF10=(1.7280,0.01342*um**2)

def indice_refraccion(wavelength, param):
	i=0
	n=sp.zeros_like(wavelength)
	for letra in param:
		n=n+letra/wavelength**i
		i=i+2
	return n

def dibujar_n(wavelength,n, titulo=''):
	plt.figure()
	plt.plot(wavelength/nm, n, 'k', linewidth = 2)
	plt.xlabel('$\lambda (nm)$', fontsize = 18)
	plt.xlim(wavelength[0]/nm,wavelength[-1]/nm)
	plt.ylabel('$n$', fontsize = 18)
	plt.title(titulo, fontsize=20)
	plt.grid(True)


#ejemplo de 1 resonancia
n=indice_refraccion(wavelength, Fused_silica)
dibujar_n(wavelength,n, titulo='Cauchy: Fused_silica')

n=indice_refraccion(wavelength, Borosilicate_BK7)
dibujar_n(wavelength,n, titulo='Cauchy: Borosilicate_BK7')

"""
wavelength=0.5
n05=indice_refraccion(wavelength,Borosilicate_BK7)
print "el indice de refraccion BK7 para  %4.4f um es %4.6f" %(wavelength,n05)
"""

plt.show()

(Source code)

8.5. Frecuencia de plasma

En los medios conductores tenemos cargas ligadas (electrones internos) y cargas libres. Sin embargo, éstos últimos son los que más afectan al índice de refracción. Por ello, suponemos que sólo hay cargas libres. La ecuación de índice de refracción se simplifica a

n_{c}^{2}=1-N_{V}^{\prime}\frac{q^{2}}{m\epsilon_{0}}\frac{1}{\omega\left(\omega+i\gamma\right)}.

Esta expresión se puede aproximar a

n_{c}^{2}(\omega)&\approx1-\frac{\omega_{p}^{2}}{\omega^{2}}.

donde

\omega_{p}=\sqrt{N_{V}^{\prime}\frac{q^{2}}{m\epsilon_{0}}}

Veamos algunos ejemplos con la expresión sin simplificar:

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
#------------------------------------
# Autor:	Luis Miguel Sanchez Brea
# Fecha		2013/10/24 (version 1.0)
# Licencia:	GPL
# Objetivo:	Frecuencia del plasma
#-------------------------------------

import scipy as sp
import matplotlib.pyplot as plt

m = 1; kg = 1; sg = 1;  V = 1; C = 1;
Hz = 1 / sg; nm = 1e-9 * m; um=1e-6

q=1.6021765e-19*C;			m=9.109382911e-31*kg
epsilon0=8.8541878176e-12;	c=299792458*m/sg

def indice_refraccion(w, Nv, gamma):
	nc2=1-Nv*q**2/(m*epsilon0*w*(w+1j*gamma))
	nc=sp.sqrt(nc2)
	return nc

def dibujar_n(w,nc, wp=0):
	plt.figure()
	n=sp.real(nc)
	kappa=sp.imag(nc)

	plt.subplot(211) 	#parte real

	plt.plot(w, n, 'k', linewidth = 2)
	plt.xlabel('$\omega \; (Hz)$', fontsize = 18)
	plt.xlim(w[0],w[-1])
	plt.ylabel('$n$', fontsize = 18)
	plt.grid(True)

	plt.subplot(212)	#parte imaginaria
	plt.plot(w, kappa, 'k', linewidth = 2)
	plt.xlabel('$\omega \; (Hz)$', fontsize = 18)
	plt.xlim(w[0],w[-1])
	plt.ylabel('$\kappa$', fontsize = 18)
	plt.grid(True)

	if wp>0:
		plt.subplot(211)
		plt.axvline(x=wp, ymin=0, ymax=1, lw=2, color='k', linestyle='--')
		plt.subplot(212)
		plt.axvline(x=wp, ymin=0, ymax=1, lw=2, color='k', linestyle='--')

	plt.tight_layout()

def ejemplo(Nv,gamma):
	wp=sp.sqrt(Nv*q**2/(m*epsilon0))
	"""	print "la frecuencia de resonancia es %4.6g" %(wp)
	print "la longitud de onda de resonancia es %4.6g" %(2*sp.pi*c/wp)"""
	w=sp.linspace(wp/4,wp*4,1000)
	nc=indice_refraccion(w, Nv,gamma)
	dibujar_n(w,nc,wp)

ejemplo(Nv=1e25, gamma=1e12)
ejemplo(Nv=1e25, gamma=1e14)
plt.show()

(Source code)