Oszilazioak |
Osziladore akoplatuak
|
Higiduraren ekuazioak | |||||||||||||||||||||||||||||
Hiru osziladore akoplatuta aztertu ondoren, azter ditzagun orokortze gisa, malgukiez eta partikulez osatutako katea luze baten oszilazio-modu normalak. Adibide honek argi erakusten ditu muturretatik lotuta dagoen soka baten bibrazio-modu normalak, uhin geldikorrak deiturikoak. Demagun N partikuladun partikula-multzo bat: m1, m2, m3…mN-1, mN masadunak, N+1 malgukiez lotuta: k0, k1, k2, k3, … kN-1, kN, irudiak erakusten duen bezala.
Higiduraren ekuazioakPartikula bakoitzak bi indar jasaten ditu: ezkerreko malgukiak eragiten diona eta eskumakoak eragiten diona. Irudiak erakusten ditu lehenak (m1), i-garrenak (mi) eta N-garrenak (mN) jasaten dituzten indarrak:
Laburtuz, partikulen higidura-ekuazioak honela idatz daitezke: Bila ditzagun honelako soluzioak: xi=Aicos(ωt) Partikulak hasieran, t=0 aldiunean pausagunean baldin badaude eta x0i posizioan, orduan hasierako faseak π/2 dira guztiak. Eta xi posizioaren bigarren deribatua kalkulatzen badugu t denborarekiko:
Honako ekuazio-sistema homogeneoa lortzen da: Eta matrize gisa adieraz daiteke: Modu sinbolikoan matrizeak honela adieraz daitezke: M·X= ω2X, eta hemen X zutabe-bektorea da, A1, A2... AN koefiziente ezezagunek osatzen dutena. Bibrazioen modu normalak kalkulatzen dira ondoko matrizearen determinantea zerora berdinduz: |M- ω2I|=0, eta hemen I matrize unitatea da. ω2-ren menpekoa den N-garren graduko polinomioaren soluzioak M matrizearen balio propioak dira. Bektore propioak berriz, maiztasun horietako bakoitzarentzat, Ai koefizienteen balioak dira. Bestela, ωj maiztasun normal bakoitzarentzat, modu normalen Ai anplitudeak honako errepikapen-erlazioa erabilita ere kalkula daitezke:
Partikula soilen higidurak Partikula soil bakoitzaren higidura izango da, bibrazio-modu guztien gainezarmena: x1=A11cos(ω1·t)+A12cos(ω2·t)+...A1N·cos(ωN·t) Hasierako baldintzetatik (t=0 aldiuneko N posizioak eta N abiadurak) koefiziente guztiak determinatzen dira: A11,A12.... A1N Demagun partikulen posizioak honakoak direla x10, x20, x30,...xN0 eta abiadura guztiak nuluak, vi0 =0. Bibrazio-modu normalak
Orain arte planteamendu orokorra formulatu dugu, baina badaude zenbait kasu berezi eta interesgarri. Kasu bereziakKasu interesgarrienetako bat da, masa guztiak berdinak direnean, m0=m1=m2=m3, …=mN-1=mN=m, eta malguki guztiak berdinak direnean, k0=k1=k2=k3, …=kN-1=kN=k, M matrizea simetrikoa da eta kalkulatu behar dira balio propioak (ω2) eta bektore propioak, esaterako Jacobi-ren metodoaz (ikus ezazu programazio kodea) Adibideak:
SaiakuntzaFinkotzat hartzen dira:
Aukeran idatz daiteke:
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. |
Dispertsio-erlazioaOndorengo irudiak erakusten ditu N partikula, m masadunak, N+1 malgukiekin lotuta, denak k konstantedunak k, eta bi muturrak finko. Demagun oreka-posizioan partikulen arteko separazioa a dela. Demagun t aldiune jakin batean 1. partikula x1 distantzia desplazatzen dela, 2. partikula x2 distantzia desplazatzen dela eta i-garren partikula xi distantzia desplazatzen dela, eta abar.
Demagun sistema oszilatzen ari dela w maiztasuneko bibrazio-modu batean. Partikula guztiek H.H.S deskribatzen dute, w maiztasun berarekin, baina Ai anplitudeak kalkulatzea falta zaigu: xi=Ai·cos(w t) Adierazpen hori ordezkatzen badugu partikula horren higidura-ekuazio diferentzialean, erlazio bat lortzen da i+1, i, eta i-1 partikulen anplitudeen artean. Bila dezagun itxura honetako soluzio bat: Ai=A·sin(K·ia) hemengo K uhin zenbakia da, K=2p/l, eta orduan: A·sin(Kia+Ka)+ A·sin(Kia-Ka)= A·sin(Kia)(2-mω2/k) Ekuazio horrek erlazionatzen ditu bibrazio-moduaren w maiztasuna eta K uhin zenbakia, eta dispertsio-erlazio deritzo. Ondoko irudiak erakusten du nola aldatzen den ω maiztasun angeluarra, K uhin zenbakiaren menpe eta (-π/a, +π/a) tartean. |
public class Jacobi { //el vector d son los valores propios //Las columnas de la matriz v son los vectores propios //devuelve el número de iteraciones static int calcula(double[][] a, int n, double[] d, double[][] v) { //Computes all eigenvalues and eigenvectors of a real symmetric matrix a[1..n][1..n]. On //output, elements of a above the diagonal are destroyed. d[1..n] returns the eigenvalues of a. //v[1..n][1..n] is a matrix whose columns contain, on output, the normalized eigenvectors of //a. nrot returns the number of Jacobi rotations that were required. int j,iq,ip,i; double tresh,theta,tau,t,sm,s,h,g,c; double[] b=new double[n]; //b=vector(1,n); double[] z=new double[n]; //z=vector(1,n); for (ip=0;ip<n;ip++) { //Initialize to the identity matrix. for (iq=0;iq<n;iq++) v[ip][iq]=0.0; v[ip][ip]=1.0; } for (ip=0;ip<n;ip++) { //Initialize b and d to the diagonal of a. b[ip]=d[ip]=a[ip][ip]; z[ip]=0.0; //This vector will accumulate terms of the form tapq as in equation (11.1.14). } int nrot=0; for (i=1;i<=50;i++) { sm=0.0; for (ip=0;ip<=n-2;ip++) { //Sum o -diagonal elements. for (iq=ip+1;iq<n;iq++) sm += Math.abs(a[ip][iq]); } if (sm == 0.0) { //The normal return, which relies on quadratic convergence to machine underflow. return nrot; } if (i < 4) tresh=0.2*sm/(n*n);// ...on the rst three sweeps. else tresh=0.0; //...thereafter. for (ip=0;ip<n-1;ip++) { for (iq=ip+1;iq<n;iq++) { g=100.0*Math.abs(a[ip][iq]); //After four sweeps, skip the rotation if the o -diagonal element is small. if (i > 4 && (float)(Math.abs(d[ip])+g) == (float)Math.abs(d[ip]) && (float)(Math.abs(d[iq])+g) == (float)Math.abs(d[iq])) a[ip][iq]=0.0; else if (Math.abs(a[ip][iq]) > tresh) { h=d[iq]-d[ip]; if ((float)(Math.abs(h)+g) == (float)Math.abs(h)) t=(a[ip][iq])/h; // t = 1=(2 ) else { theta=0.5*h/(a[ip][iq]); //Equation (11.1.10). t=1.0/(Math.abs(theta)+Math.sqrt(1.0+theta*theta)); if (theta < 0.0) t = -t; } c=1.0/Math.sqrt(1+t*t); s=t*c; tau=s/(1.0+c); h=t*a[ip][iq]; z[ip] -= h; z[iq] += h; d[ip] -= h; d[iq] += h; a[ip][iq]=0.0; for (j=0;j<=ip-1;j++) { //Case of rotations 1 j < p. g=a[j][ip]; h=a[j][iq]; a[j][ip]=g-s*(h+g*tau); a[j][iq]=h+s*(g-h*tau); } for (j=ip+1;j<=iq-1;j++) { //Case of rotations p < j < q. g=a[ip][j]; h=a[j][iq]; a[ip][j]=g-s*(h+g*tau); a[j][iq]=h+s*(g-h*tau); } for (j=iq+1;j<n;j++) { //Case of rotations q < j n. g=a[ip][j]; h=a[iq][j]; a[ip][j]=g-s*(h+g*tau); a[iq][j]=h+s*(g-h*tau); } for (j=0;j<n;j++) { g=v[j][ip]; h=v[j][iq]; v[j][ip]=g-s*(h+g*tau); v[j][iq]=h+s*(g-h*tau); } ++nrot; } } } for (ip=0;ip<n;ip++) { b[ip] += z[ip]; d[ip]=b[ip]; //Update d with the sum of tapq, z[ip]=0.0; //and reinitialize z. } } return nrot; } } //Valores y vectores propios de la matriz M double N=3; double[] k=new double[N+1]; double[] m=new double [N+1]; for(int i=0; i<k.length; i++){ k[i]=1.0; 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]; double[] valores=new double[N]; double[] vectores=new double[N][N]; Jacobi.calcula(matrix, N, valores, vectores); ordenar(valores, vectores); System.out.println("valores y vectores propios"); for(int i=0; i<N; i++){ System.out.print(valores[i]+"\t"); } System.out.println(); for(int i=0; i<N; i++){ System.out.println(); for(int j=0; j<N; j++) System.out.print(vectores[i][j]+"\t"); } private void ordenar(double[] x, double[][] mat){ double aux; double[] vAux=new double[x.length]; for(int i=0; i<x.length-1; i++){ for(int j=i+1; j<x.length; j++){ if(x[i]>x[j]){ aux=x[j]; for(int k=0; k<x.length; k++) vAux[k]=mat[k][j]; x[j]=x[i]; for(int k=0; k<x.length; k++) mat[k][j]=mat[k][i]; x[i]=aux; for(int k=0; k<x.length; k++) mat[k][i]=vAux[k]; } } } } |
Press W. H., Teukolsky S. A., Vetterling W. T., Flannery B. P. Numerical Recipes in C, Second edition, Eigensystems. Jacobi Transformations of a Symmetric Matrix, Chapter 11º. pp. 463-469. Cambridge University Press.
OHARRA: Orri honen autoreak erreferentzia horretako kodea (C lengoaian) Java lengoaiara egokitu du.