Oscilaciones  de una cadena diatómica lineal

prev.gif (1231 bytes)home.gif (1232 bytes)next.gif (1211 bytes)

Oscilaciones

Dos acoplados
Tres acoplados
marca.gif (847 bytes)Cadena diatómica
Varilla que pende 
 de dos muelles
Péndulo de Wilberforce
El péndulo doble
Péndulo-muelle
De las oscilaciones
a las ondas
Péndulos no acoplados
de distinta longitud

Sistema formado por dos partículas N=2

Sistema formado por tres partículas N=3

Sistema formado por N partículas

Actividades

Relación de dispersión

Referencias

Código fuente

 

En esta página, vamos a calcular los modos normales de vibración de una cadena diatómica lineal formada por moléculas de masas m  y M unidas por muelles elásticos de constante, k tal como se muestra en la figura

 

Sistema formado por dos partículas N=2

Ecuaciones del movimiento 

Buscamos una solución de la forma

x1=A1cos(ωt), x2=A2cos(ωt)

El sistema de ecuaciones se expresa en forma matricial

Como vemos la matriz ha dejado de ser simétrica

Las frecuencias son los valores propios de la matriz cuadrada  |M- ω2I|=0, las raíces de la ecuación de segundo grado en ω2 denominado polinomio característico

La amplitudes para cada uno de los modos de vibración se calculan resolviendo el sistema de ecuaciones homogéneo

  • Para el modo normal ω1, se calcula A21 en función de A11

  • Para el modo normal ω2, se calcula A22 en función de A12

El movimiento general de las partículas es una combinación lineal de los dos modos normales de vibración

x1=A11cos(ω1t)+A12cos(ω2t)
x2=A21
cos(ω1t)+A22cos(ω2t)

Los coeficientes A11 y A12 se determinan a partir de las condiciones iniciales: en el instante t=0, la posición inicial de las partículas es x10 y x20

 

Sistema formado por tres partículas N=3

Ecuaciones del movimiento 

Buscamos una solución de la forma

x1=A1cos(ωt), x2=A2cos(ωt), x3=A3cos(ωt)

El sistema de ecuaciones se expresa en forma matricial

Como vemos la matriz ha dejado de ser simétrica

Las frecuencias son los valores propios de la matriz cuadrada, las raíces de la ecuación cúbica en ω2denominado polinomio característico

La amplitudes para cada uno de los modos de vibración se calculan resolviendo el sistema de ecuaciones homogéneo

  • Para el modo normal ω1, se calcula A21 y A31 en función de A11

  • Para el modo normal ω2, se calcula A22 y A32 en función de A12

  • Para el modo normal ω3, se calcula A23 y A33 en función de A13

El movimiento general de las partículas es una combinación lineal de los tres modos normales de vibración

x1=A11cos(ω1t)+A12cos(ω2t)+A13cos(ω3t)
x2=A21
cos(ω1t)+A22cos(ω2t)+A23cos(ω3t)
x3=A31
cos(ω1t)+A32cos(ω2t)+A33cos(ω3t)

Los coeficientes A11, A12 y A13 se determinan a partir de las condiciones iniciales: en el instante t=0, la posición inicial de las partículas es x10, x20 y x30

 

Sistema formado por N partículas

Para N partículas calculamos los valores y los vectores propios de la matriz

Como la matriz no es simétrica no podemos aplicar el procedimiento de Jacobi. Como alternativa, obtenemos los coeficientes del polinomio característico aplicando el procedimiento de Leverrier y calculamos las raíces del polinomio aplicando el procedimiento del punto medio para raíces múltiples.

Calculamos las amplitudes Ai mediante la relación de recurrencia

Donde m1=m, m2=M, m3=m, m4=M,…

  • Para el modo normal ω1 se calculan las amplitudes A2, A3…. AN en función de A1, que denominaremos A11, A21, A31… AN1

  • Para el modo normal ωj se calculan las amplitudes A2, A3…. AN en función de A1, que denominaremos A1j, A2j, A3j… ANj

  • Para el modo normal ωN se calculan las amplitudes A2, A3…. AN en función de A1, que denominaremos A1N, A2N, A3N… ANN.

Una vez calculadas las amplitudes Aij para cada frecuencia ωj se normalizan

 

 

Actividades

Se ha fijado

  • La masa, m=1 kg

  • La constante elástica de los muelles impares, k=1 N/m

Se introduce

  • El número N de partículas, en el control de selección titulado Número de partículas

  • La masa M de las otras partículas en el control de edición titulado Masa

Se pulsa el botón titulado Nuevo

Observamos el primer modo normal de vibración, en la parte superior izquierda se proporciona la frecuencia angular ω1.

Se pulsa el botón titulado Siguiente>>,  observamos los siguientes modos normales ω2, … etc.

Se pulsa el botón titulado Anterior<< para observar el modo normal de vibración anterior.

Las frecuencias de los modos de vibración se guardan en el control área de texto situado a la izquierda del applet.

Se pulsa el botón titulado Gráfica, para representar las frecuencias de los modos de vibración (en el eje vertical) en función de su orden.

 

                                 

 

Relación de dispersión

Consideremos una cadena lineal de moléculas diatómicas separados una distancia a en la situación de equilibrio, tal como se muestra en la figura.

Consideremos el movimiento de dos átomos contiguos.

  • El desplazamiento del átomo i de masa M denominamos yi

  • El desplazamiento del átomo i+1 de masa m denominamos xi+1

Ecuaciones del movimiento

Buscamos una solución de la forma

yi=Aicos(ωt), con Ai=Asen(Kia)

xi+1=Ai+1cos(ωt), con Ai+1=Bsen(K(i+1)a)

donde K se denomina número de onda

Introducimos estas soluciones en las dos ecuaciones diferenciales y obtenemos un sistema homogéneo de dos ecuaciones con dos incógnitas A y B.

A(-ω2M+2k)sen(Kia)-Bk(sen(K(i+1)a)+sen(K(i-1)a))=0
-Ak
(sen(K(i+2)a)+sen(Kia))+B(-ω2m+2k) sen(K(i+1)a)=0

Teniendo en cuenta que

sen(K(i+1)a)+sen(K(i-1)a)=2sen(Kia)cos(Ka)
sen(K(i+2)a)+sen(Kia)= 2sen(K (i+1)a)cos(Ka)

y eliminamos A y B en el sistema homogéneo de dos ecuaciones

(-ω2M+2k) (-ω2m+2k)sen(Kia)sen(K(i+1)a)-4k2sen(Kia)cos2(Ka)sen(K(i+1)a))=0

Simplificando el factor común sen(Kia)sen(K(i+1)a)

Esta ecuación que relaciona la frecuencia w con el número de onda K, se denomina relación de dispersión.

En la figura, se representa se representa la frecuencia angular ω en función del número de onda K en el intervalo (-π/a, +π/a). La curva superior (signo +) se denomina rama óptica, y la inferior (signo -) se denomina rama acústica.

 

 

Referencias

Runk R. B. Stul J. L. Anderson G. L. A laboratory analog for lattice dynamics. Am. J. Phys. (31) 1963, pp. 915-921

 

Código fuente

public class Matriz {
	public int n; //dimensión
	private double[][] x;

public Matriz(int n) {
	this.n=n;
	x=new double[n][n];
	for(int i=0; i<n; i++){
		for(int j=0; j<n; j++){
			x[i][j]=0.0;
		}
	}
}
public Matriz(double[][] x) {
	this.x=x;
	n=x.length;
}

double traza(){
	double tr=0.0;
	for(int i=0; i<n; i++){
		tr+=x[i][i];
	}
	return tr;
}
//suma de dos matrices
static Matriz suma(Matriz a, Matriz b){
	Matriz resultado=new Matriz(a.n);
	for(int i=0; i<a.n; i++){
		for(int j=0; j<a.n; j++){
			resultado.x[i][j]=a.x[i][j]+b.x[i][j];
		}
	}
	return resultado;
}
//producto de dos matrices
static Matriz producto(Matriz a, Matriz b){
	Matriz resultado=new Matriz(a.n);
	for(int i=0; i<a.n; i++){
		for(int j=0; j<a.n; j++){
			for(int k=0; k<a.n; k++){
				resultado.x[i][j]+=a.x[i][k]*b.x[k][j];
			}
		}
	}
	return resultado;
}
//polinomio característico

public double[] polCaracteristico(){
	Matriz pot=new Matriz(n);
//matriz unidad
	for(int i=0; i<n; i++){
		pot.x[i][i]=1.0;
	}
	double[] p=new double[n+1];
	double[] s=new double[n+1];
	for(int i=1; i<=n; i++){
		pot=Matriz.producto(pot, this);
		s[i]=pot.traza();
	}
	p[0]=1.0;
	p[1]=-s[1];
	for(int i=2; i<=n; i++){
		p[i]=-s[i]/i;
		for(int j=1; j<i; j++){
			p[i]-=s[i-j]*p[j]/i;
		}
	}
	return p;
}

public String toString(){
	String texto="\n";
	for(int i=0; i<n; i++){
		for(int j=0; j<n; j++){
			texto+="\t "+(double)Math.round(1000*x[i][j])/1000;
		}
		texto+="\n";
	}
	texto+="\n";
	return texto;
}

}
public abstract class Ecuacion {
	protected final double CERO=1e-10;
	protected final double ERROR=0.0001;
	protected final int MAXITER=100;
	protected final int MAXRAICES=20;
	protected double raices[]=new double[MAXRAICES];
	protected int iRaiz=0;

protected double puntoMedio(double a, double b)throws RaizExcepcion{
	double m, ym;
	int iter=0;
	do{
		m=(a+b)/2;
		ym=f(m);
		if(Math.abs(ym)<CERO) break;
		if(Math.abs((a-b)/m)<ERROR) break;

		if((f(a)*ym)<0) b=m;
		else a=m;
		iter++;
	}while(iter<MAXITER);
	if(iter==MAXITER){
		throw new RaizExcepcion("No se ha encontrado una raíz");
	}
	return m;
}

protected void explorar(double xIni, double xFin, double dx){
	double y1, y2;
	iRaiz=0;
	y1=f(xIni);
	for(double x=xIni; x<xFin; x+=dx){
		y2=f(x+dx);
//Uno de los extremos del intervalo es raíz
		if(Math.abs(y1)<CERO && iRaiz<MAXRAICES){
			raices[iRaiz++]=x;
			y1=y2;
			continue;
		}
//no hay raíz en este intervalo
		if(y1*y2>=0.0){
			y1=y2;
			continue;
		}
//hay una raíz en este intervalo
		if(iRaiz<MAXRAICES){
			try{
				raices[iRaiz]=puntoMedio(x, x+dx);
				iRaiz++;
			}catch(RaizExcepcion ex){
				System.out.println(ex.getMessage());
			}
		}
		y1=y2;
	}
}
public double[] hallarRaices(double ini, double fin, double paso){
	explorar(ini, fin, paso);
	double solucion[]=new double[iRaiz];
	for(int i=0; i<iRaiz; i++){
		solucion[i]=(double)Math.round(raices[i]*1000)/1000;
	}
	return solucion;
}

abstract public double f(double x);
}

class RaizExcepcion extends Exception {
	public RaizExcepcion(String s) {
	super(s);
}
}
public class Funcion1 extends Ecuacion{
	double[]coef;

Funcion1 (double[]coef){
	this.coef=coef;
}
public double f(double x){
	double y=0.0;
//sucesivas potencias de x, se puede utilizar tambien la funcion Math.pow
	double[] pot_x=new double[coef.length];
	pot_x[0]=1.0;
	for(int i=1; i<coef.length; i++){
		pot_x[i]=pot_x[i-1]*x;
	}
//valores de los sucesivos términos
	for(int i=0; i<coef.length; i++){
		y+=coef[i]*pot_x[coef.length-i-1];
	}
	return y;
}

}
//calcula los valores y vectores propios
//matriz M
	double[] k=new double[N+1];
	double[] m=new double [N+1];
	for(int i=0; i<k.length; i++){
		k[i]=1.0;
		if(i%2==0) m[i]=masa;
		else m[i]=1.0;
	}
	double[][] matrix=new double[N][N];
	for(int i=0; i<N; i++)
		for(int j=0; j<N; j++)
			matrix[i][j]=0.0;

	matrix[0][0]=(k[0]+k[1])/m[1];
	matrix[0][1]=-k[1]/m[1];
	for(int i=1; i<N-1; i++){
		matrix[i][i-1]=-k[i]/m[i+1];
		matrix[i][i]=(k[i]+k[i+1])/m[i+1];
		matrix[i][i+1]=-k[i+1]/m[i+1];
	}
	matrix[N-1][N-1]=(k[N-1]+k[N])/m[N];
	matrix[N-1][N-2]=-k[N-1]/m[N];
//polinomio característico
	Matriz p=new Matriz(matrix);
	double pol[]=p.polCaracteristico();
	System.out.println("Polinomio característico");
	for(int i=0; i<pol.length; i++){
		System.out.print((double)Math.round(pol[i]*1000)/1000+" , ");
	}
//valores propios
	double[] valores=new Funcion1(pol).hallarRaices(0.0, 10, 0.05);
	double[][] vectores=new double[N][N];
 	System.out.print("Raíces de una ecuación");
	for(int i=0; i<N; i++){
		System.out.print(" "+valores[i]);
	}
	System.out.println(""); 
//vectores propios
	double[] aux=new double[N+1];
	double temp;
	for(int j=0; j<N; j++){
		aux[0]=0.0;
		aux[1]=1.0;
		for(int i=1; i<N; i++){
			aux[i+1]=-k[i-1]*aux[i-1]/k[i]+(k[i-1]/k[i]+1-valores[j]*m[i])*aux[i];
		}
		temp=0.0;
		for(int i=1; i<=N; i++){
			temp+=aux[i]*aux[i];
		}
		for(int i=0; i<N; i++){
			vectores[i][j]=aux[i+1]/Math.sqrt(temp);
		}
	}