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.