Oszilazioak |
Bi partikulaz osatutako sistema,
N=2 Hiru partikulaz osatutako sistema, N=3 |
||
Orri honetan katea diatomiko lineal baten oszilazioak aztertuko ditugu. Demagun bi atomo mota ditugula, m eta M masadunak, k konstantedun malguki batez lotuta daudela, eta bikotea behin eta berriz errepikatzen dela.
Bi partikulaz osatutako sistema, N=2Higiduraren ekuazioak: Bila ditzagun itxura honetako soluzioak: x1=A1cos(ωt), x2=A2cos(ωt) Matrize gisa, honela adierazten da ekuazio-sistema hori: Honako kasuan, matrizea ez da simetrikoa. Bibrazioen modu normalak kalkulatzen dira ondoko matrizearen determinantea zerora berdinduz: |M- ω2I|=0, eta hemen I matrize unitatea da. ω2-ren menpekoa den bigarren graduko polinomioaren soluzioak (polinomio karakteristikoa deiturikoa) M matrizearen balio propioak dira. Bektore propioak berriz, maiztasun horietako bakoitzarentzat, Ai koefizienteen balioak dira. ωj maiztasun normal bakoitzarentzat, modu normalen Ai anplitudeak honako ekuazio-sistema homogeneoa ebatziz kalkula daitezke:
Partikula bien higidura orokorra bi oszilazio-modu normalen konbinazioa izango da. x1=A11cos(ω1t)+A12cos(ω2t) A11 eta A12 koefizienteak hasierako baldintzetatik determinatzen dira, alegia, t=0 aldiunean bi partikulen posizioak x10 eta x20 dira. Hiru partikulaz osatutako sistema, N=3Higiduraren ekuazioak: Bila ditzagun itxura honetako soluzioak: x1=A1cos(ωt), x2=A2cos(ωt), x3=A3cos(ωt) Matrize gisa, honela adierazten da ekuazio-sistema hori: Honako kasuan, matrizea ez da simetrikoa. Bibrazioen modu normalak lortzen dira matrize karratuaren balio propioak kalkulatzen (polinomio karakteristikoa deiturikoa). Kasu honetan, ω2-ren menpeko hirugarren graduko ekuazioa (kubikoa) da. Maiztasun horietako bakoitzarentzat, Ai koefizienteak kalkulatzen dira honako ekuazio-sistema homogeneoa ebatziz:
Partikulen higidura orokorra, ez da modu normal bat, hiru bibrazio-moduen konbinazio lineala baizik. x1=A11cos(ω1t)+A12cos(ω2t)+A13cos(ω3t) A11, A12 eta A13 koefizienteak hasierako baldintzetatik determinatzen dira, alegia, t=0 aldiunean, hiru partikulen posizioak x10 , x20 eta x30 dira. N partikulaz osatutako sistemaN partikulekin honako matrizearen balio propioak eta bektore propioak kalkulatu behar dira: Matrizea ez da simetrikoa, eta horregatik ezin da Jacobi-ren prozedura erabili, baina polinomio karakteristikoaren koefizienteak kalkula ditzakegu Leverrier-en prozedura aplikatuz eta, ondoren, polinomioaren erro anitzak kalkula ditzakegu prozedura numeriko batez, besteak beste, erdiko puntuaren prozedura. Ai anplitudeak kalkulatzeko erabil dezagun honako errepikapen erlazioa edo ekuazio-sistema homogeneoa:
Hemen m1=m , m2=M , m3=m , m4=M,…
Anplitude guztiak kalkulatu ondoren (Aij) normalizatu egin behar dira: (N2 anplitude)
SaiakuntzaFinkotzat hartzen dira:
Eta aukeran idatz daitezke:
Berria botoia sakatu. Lehenik, partikula-multzoa bibratzen ikusten da, lehen bibrazio-modu normalean. Goiko eta ezkerreko erpinean maiztasun angeluarra idatziz erakusten da: ω1. Hurrengoa>> izeneko botoia sakatuz, hurrengo bibrazio-modu normala ikusten da, ω2, eta behin eta berriz sakatuz, ω3 ,ω4 , … etab. Aurrekoa<< izeneko botoia sakatuz, aurreko bibrazio-modu normala ikusten da. Modu normalen kopurua eta partikula-kopurua beti dira berdinak. Leihatilaren ezkerraldeko testu-zutabean, programak bibrazio-moduen maiztasunak idazten ditu. Azkenean, Grafikoa botoia sakatuz, bibrazio-moduen maiztasunak adierazten dira ordenaren arabera. |
Dispertsio erlazioaOndorengo irudiak erakusten du N partikulaz osaturiko katea lineal bat, baina bakoitiak m masa dute eta bikoitiek M. Demagun oreka-posizioan partikulen arteko separazioa a dela.
Azter dezagun bi atomo moten higidura:
Hona hemen higiduraren ekuazioak:
Bila ditzagun itxura honetako soluzioak: yi=Aicos(ωt), eta Ai=A·sin(Kia) xi+1=Ai+1cos(ωt), eta Ai+1=B·sin(K(i+1)a) Hemen, K-ri uhin-zenbaki deritzo. Ordezka ditzagun soluzio horiek ekuazio diferentzialetan eta lortzen da, bi ekuaziodun eta bi ezezaguneko sistema homogeneoa. Ezezagunak A eta B dira: A(-ω2M+2k)sin(Kia)-Bk(sin(K(i+1)a)+sin(K(i-1)a))=0 Eta kontutan hartzen bada: sin(K(i+1)a)+sin(K(i-1)a)=2sin(Kia)cos(Ka) Eta eliminatzen baditugu A eta B bi ekuaziodun sistema homogeneoan: (-ω2M+2k) (-ω2m+2k)sin(Kia)sin(K(i+1)a)-4k2sin(Kia)cos2(Ka)sin(K(i+1)a))=0 Faktore komun bat osorik sinplifikatzen da: sin(Kia)sin(K(i+1)a) Orduan:
Ekuazio horrek erlazionatzen ditu w maiztasun angeluarra eta K uhin-zenbakia, alegia, dispertsio-erlazioa deritzona. Ondoko irudiak erakusten du ω maiztasun angeluarra K uhin-zenbakiaren menpe, eta (-π/a, +π/a) tartean. Goiko kurba urdinari (positiboari) adar optiko deritzo eta azpiko gorriari (negatiboari) adar akustiko.
|
Runk R. B. Stul J. L. Anderson G. L. A laboratory analog for lattice dynamics. Am. J. Phys. (31) 1963, pp. 915-921
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); } } |